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;
                }
            }

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~DefaultValue让我的UnitOfWork更可读,如需转载请自行联系原博主。

目录
相关文章
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
255 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
249 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
|
Cloud Native 架构师
|
存储 开发框架 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
- 连接字符串 - 异步编程 - 日志 - DbContext池 - 类和配置表 - 属性和列配置 - 并发token - 索引
310 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
- ORM - Repository 仓储 - UnitOfWork 工作单元 - DB Context 与 DB Set - EF Core快速开始示例
292 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记