zoukankan      html  css  js  c++  java
  • 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;
                    }
                }

    回到目录

  • 相关阅读:
    求斐波那契数列的第n项
    八大经典排序算法
    [BZOJ 3083] 遥远的国度
    [BZOJ 3306] 树
    [SCOI 2010] 序列操作
    [AHOI 2013] 差异
    [USACO2006 DEC] Milk Patterns
    [JSOI 2007] 字符加密
    [BZOJ 2588] Count on a tree
    [NOIP 2018 Day1] 简要题解
  • 原文地址:https://www.cnblogs.com/lori/p/3282988.html
Copyright © 2011-2022 走看看