文章出處
文章列表
在Poco實體中,一般只有屬性沒有方法,這在軟件設計中稱為貧血模型,而在DDD領域驅動設計中,比較提倡充血模型,即你的Poco實體中,即有屬性,也有操作屬性的方法,注意這里說的是操作屬性的方法,你的具體業務方法不要寫在這里!
而在實際項目中,我們可以有這樣的需求,一個注冊用戶業務,它有密碼和確認密碼,這個確認密碼不需要存儲到數據表里,即不需要被持久化,這時,我們想到的就是為它加NonSerialized特性,而在使用過程中我們發現,這個特性只針對字段而言,而我們的實體中推薦使用屬性的方式,所以我們需要尋找其它解決方案。
而對于 System.ComponentModel.DataAnnotations.Schema命名空間來說,確實有一個更好的特性適合我們的需求,這個就是NotMapped特性,從它的注釋中可以看出,它主要功能就是從數據庫映射中移除它,即數據表中不體現這個屬性,現在我們代碼代碼修改一下,使用NotMapped實現的實體模型:
/// <summary> /// 用戶實體模式 /// </summary> public class UserInfo : Entity { /// <summary> /// maxLength和stringLength都可以用來設置數據表字段的長度,stringLength不可以用來做MVC驗證 /// </summary> [DisplayName("用戶名"), Required, StringLength(50, MinimumLength = 6, ErrorMessage = "用戶名只能由6~50個字符組成")] public string UserName { get; set; } [DisplayName("真實姓名"), Required, StringLength(30, MinimumLength = 6, ErrorMessage = "真實姓名只能由6~30個字符組成")] public string RealName { get; set; } public UserExtension UserExtension { get; set; } public List<OrderInfo> OrderInfo { get; set; } [DisplayName("密碼"), StringLength(20, MinimumLength = 8, ErrorMessage = "密碼由8~20個字符組成")] public string Password { get; set; } [DisplayName("確認密碼"), NotMapped] public virtual string TruePassword { get; set; } #region 充血模型的方法 /// <summary> /// 生成MD5密碼 /// </summary> /// <returns></returns> public string Md5Password() { return Lind.DDD.Commons.Encryptor.Utility.EncryptString(Password, Commons.Encryptor.Utility.EncryptorType.MD5); } /// <summary> /// 密碼和確認密碼的比較 /// </summary> /// <returns></returns> public bool Password_TruePassword() { return this.Password.Equals(this.TruePassword, StringComparison.CurrentCulture); } #endregion }
運行程序后,我們在數據表UserInfo中沒有找到TruePassword這個字段,這說明NotMapped已經幫我們實現了我們想要的功能!
通過上面的代碼,我們也看到了在DDD領域驅動里充血模型的實現,需要注意的地方就是什么樣的方法應該寫在模型里,什么樣的方法應該寫在業務層。
文章列表
全站熱搜