EF架構~DefaultValue讓我的UnitOfWork更可讀


回到目錄

在編程世界里,使用“否定式”不是一件好事,因為它的可讀性並不高,但有時,為了讓使用者減少代碼量,還是使用了雙重否定,直到DefaultValue的出現,它改變了這一切,它可以為你的屬性設置你想要的默認值,如bool類型默認值是false,而如果你希望它的默認值是true,就需要用到DefaultValue這個特性了。

這是我IUnitOfWork代碼片斷

   /// <summary>
    /// 工作單元
    /// 提供一個保存方法,它可以對調用層公開,為了減少連庫次數
    /// </summary>
    public interface IUnitOfWork
    {
        /// <summary>
        /// 將操作提交到數據庫,
        /// </summary>
        void Save();
        /// <summary>
        /// 是否不提交到數據庫
        /// 默認為false,即默認為提交到數據庫
        /// </summary>
        /// <returns></returns>
        bool IsNotSubmit { get; set; }
    }

    /// <summary>
    /// 工作單元
    /// 對泛型類型的支持
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IUnitOfWork<T> : IUnitOfWork where T : class { }

上面代碼的IsNotSubmit就是一個否定式的,這不是我們推薦的,但沒辦法,使用它,可以簡化代碼!它的意思是不把修改提交到數據庫,bool類型默認是false

,也就是說,它默認是把修改提交的數據庫,怎么樣,挺繞吧,呵呵。

當DefaultValue出現后,就改變了這一切,你可以這樣定義它了

  public interface IUnitOfWork
    {
        /// <summary>
        /// 將操作提交到數據庫,
        /// </summary>
        void Save();
        /// <summary>
        /// 是否提交到數據庫
        /// 默認為true,即默認為提交到數據庫
        /// </summary>
        /// <returns></returns>
        [DefaultValue(true)]
        bool IsSubmit { get; set; }

    }

這樣的接口定義意思就很清晰了,IsSubmit就是提交,true就是提交,false就是不提交,多清晰呀,呵呵!

再來看如何得到IsSubmit的值,如果直接使用它結果還會是false,你需要反射一下,從TypeDescriptor里得到它的值才是DefaultValue,呵呵 

     /// <summary>
        /// 數據上下文
        /// </summary>
        class DataContext : IUnitOfWork
        {
            #region IUnitOfWork 成員

            public void Save()
            {
                throw new NotImplementedException();
            }
            /// <summary>
            /// 類不會繼承接口的特性信息
            /// </summary>
            [DefaultValue(true)]
            public bool IsSubmit
            {
                get;
                set;
            }

            #endregion
        }

好,我們現在輸出一下信息,看看IsSubmit的值

        AttributeCollection attrColl = TypeDescriptor.GetProperties(new DataContext())["IsSubmit"].Attributes;
            DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
            bool _Value = (bool)attr.Value;
            Console.WriteLine(_Value);

結果:

怎么樣,現在程序中可以把否定式去掉了吧,呵呵 

而將這個技術應用到我們的架構中,可以這樣來實現:(如果為IsSubmit設置了新值,就使用新值,如果沒有設置,那就用默認值,大家可以使用default(bool)得到bool類型的默認值,同理default(string)就是字符型的)

        private bool isSubmit;
            /// <summary>
            /// 類不會繼承接口的特性信息
            /// </summary>
            [DefaultValue(true)]
            public bool IsSubmit
            {
                get { return isSubmit; }
                set
                {
                    AttributeCollection attrColl = TypeDescriptor.GetProperties(this)["IsSubmit"].Attributes;
                    DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
                    if (value == default(bool))
                        isSubmit = (bool)attr.Value;
                    else
                        isSubmit = value;
                }
            }

 

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM