文章出處

回到目錄

在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領域驅動里充血模型的實現,需要注意的地方就是什么樣的方法應該寫在模型里,什么樣的方法應該寫在業務層。

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()