目前公司寫的程式已經告一段落了,這個程式從一開始就定位為可二次開發的系統,作為商務應用程式,二次開發的主要需求包括:
- 所有二次開發理論上不修改任何現有代碼和發布方式,以及不用公開原始碼;
- 添加新的業務實體,以及對應的商務服務和介面;
- 現有實體中添加新的欄位,增加新的業務校正、在已有流程中增加新的動作,以及在已有介面中增加新的表現;
- 重構已有的實現;
- 所有的組件都可以組合和拆分,保證仍然能夠工作正常。
- 公司內部的開發和二次開發具有相同的模型和體驗。
這些需求將直接影響產品設計的方方面面,現在這個平台的第一個作品已經開發到beta,現在開始準備二次開發的實踐。因為涉及到公司的機密,所以不能講實現原理,我這裡將講解二次開發的體驗部分。
首先二次開發商建立獨立的DLL,引入實體和服務介面庫;
然後為新的實體添加欄位,例如: [DataEntity("AccountId",TypeKey="Account")]
[Serializable]
public class AccountEx : Account {
private string _newField;
/**//// <summary>
/// 返回/設定新的擴充欄位
/// </summary>
public string NewField {
get { return _newField; }
set {
if (_newField != value) {
_newField = value;
OnPropertyChanged("NewField");
}
}
}
}
在這裡例子中,新的實體繼承了已有實體,並添加了新的欄位:NewField。但注意,實體仍然標記為Account以便保持相容。
下面再介紹如何添加新的商業規則。
建立一個外掛程式,標明對應到Account服務,並在初始化時攔截原有服務的SaveBefore事件。 [ServiceAddin(Account.TYPE_KEY)]
public class AccountServiceAddin : BusinessServiceAddin<Account,CrmBusinessServiceEx<Account>> {
protected override void InitializeComponent() {
base.InitializeComponent();
Owner.SaveBefore += new System.EventHandler<BusinessServiceBase<Account>.SaveBeforeArgs>(Owner_SaveBefore);
}
void Owner_SaveBefore(object sender, BusinessServiceBase<Account>.SaveBeforeArgs e) {
AccountEx newObject = (AccountEx)e.DataEntity;
newObject.NewField = DateTime.Now.ToString();
}
}
在這裡例子中簡單的為NewFiled賦了新的值。
關於介面的可擴充性將在後面的文章中介紹,總結以上的開發體驗,大多數功能都已經實現,但是最後一條關於公司內部和二次開發商具有相同的開發體驗方面做的很不好,主要表現為:
- 新加的欄位繼承了已有實體Account,更好的方法是建立獨立的實體,與已有的實體形成“桶裝”方式;
- 新擴充的商業規則使用了外掛程式的方式,但公司內部的開發卻使用了繼承並重載的模式;
相信很多的架構師在此方面都有很多的經驗,希望可以給予指導。
路漫漫......