回到目录

在编程世界里,使用“否定式”不是一件好事,因为它的可读性并不高,但有时,为了让使用者减少代码量,还是使用了双重否定,直到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);

结果:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ0AAAArCAIAAADt8krAAAACoklEQVR4nO2dS27DMAwFfbQcLUfTsssueqAuChiqST5SsuM4xsxKpih+LL0EiVN0+fn+ej6fj8ejtdZaW5ZlWRY9/rtsHUuAmN3EGfXXeaMa7MLIYmfPiQMXZdVJb3TPrntA9TZHs278on8lr+sp6nc72vifEwcuitWJ2G8xu0GcAGtv/0n9RV6Rzq2/7v+uOHAJNjrRh9g66G2OohWdhf+oTqL66/7vigOXoNeJOKmrfY9Ohpy1/4ROREnCYs/3S+PARRn6HJ9eirX6QOg4Ff+iZ/F828tz4sBF2eikZ/Vx7UX/3hjVYJ2Fv8ibxt/p/6448H7c77sA4B/oBCAHnQDkoBOAHHQCkINOAHLQCUBO9PzkRek++rnBaPFzD1vmqhpdZfN+7r6cgfu7laGjUM/Vh92/u9Nr98QZFcnQqgN1Uo+z2XF04hP9vquyZ0P7unHeo5OjXvYm4lxQJ4fE4Z0koaKT1rEubAZ3amN0a6jEPyrveiniCFzPoX57e6XluX7nptymRM2Vem7C0PtJenOFf+Rc2YNK3or/aP262mLeUf+oZreFomWiL1uDLaAyvgmj7yfRvva4/tq5Po5CNYM7G6UuIlIXlxT7Wsf9wM1V70vcIn1L3XrcsRv8DqQ6Ke6ra6ysrfiP5rW4mzexnWKJKHKiL3t/7O2KSjqqr9Qoerkb6fddlX095ByckLdoXy124yPP/eNoqh+kBaR9RRSbnevrDlSen/RGd2sn/ItGO67kjeIU6x+Kv8e+BHoQvdsp0bXty0VH0DcnqqeS95PgeTxADjoByEEnADnoBCAHnQDkoBOAHHQCkINOAHLQCUAOOgHIQScAOegEIAedAOSgE4AcdAKQI/7/yT3/kABgAnQCkINOAHLQCUAOn+MBUn4B+kiRLJ6IxogAAAAASUVORK5CYII=" alt="" />

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

而将这个技术应用到我们的架构中,可以这样来实现:(如果为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更可读的更多相关文章

  1. EF架构~数据分批批量提交

    回到目录 对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发 ...

  2. EF架构~基于EF数据层的实现

    回到目录 之前写过关于实现一个完整的EF架构的文章,文章的阅读量也是满大的,自己很欣慰,但是,那篇文章是我2011年写的,所以,技术有些不成熟,所以今天把我的2014年写的EF底层架构公开一下,这个架 ...

  3. EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一

    回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是sect ...

  4. EF架构~codeFirst从初始化到数据库迁移

    一些介绍 CodeFirst是EntityFrameworks的一种开发模式,即代码优先,它以业务代码为主,通过代码来生成数据库,并且加上migration的强大数据表比对功能来生成数据库版本,让程序 ...

  5. EF架构~为EF DbContext生成的实体添加注释(T5模板应用)

    回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...

  6. EF架构~扩展一个分页处理大数据的方法

    回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...

  7. EF架构~CodeFirst数据迁移与防数据库删除

    回到目录 本文介绍两个概念,防数据库自动删除,这是由于在code first模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...

  8. EF架构~CodeFirst生产环境的Migrations

    回到目录 Migrations即迁移,它是EF的code first模式出现的产物,它意思是说,将代码的变化反映到数据库上,这种反映有两种环境,一是本地开发环境,别一种是服务器的生产环境,本地开发环境 ...

  9. EF架构~为EF DbContext生成的实体添加注释(T5模板应用)(转载)

    转载地址:http://www.newlifex.com/showtopic-1072.aspx 最近新项目要用Entity Framework 6.x,但是我发现从数据库生成模型时没有生成字段的注释 ...

随机推荐

  1. Windows 下 ffmpeg 转 mp4

    最近在研究所有视频格式转  mp4 因为html5 只支持mov MP4 等格式..查阅了 很多资料发现  转成flv  很简单.. 可是要转 mp4 就难了... 经过我不屑的努力..终于转换成功了 ...

  2. 241. Different Ways to Add Parentheses

    241. Different Ways to Add Parentheses https://leetcode.com/problems/different-ways-to-add-parenthes ...

  3. 实验一报告--认识DOS

    实验一  DOS命令解释程序的编写 13物联网             黄鸿佳              201306104107 一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: ...

  4. (多重背包+记录路径)Charlie's Change (poj 1787)

    http://poj.org/problem?id=1787   描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...

  5. http://blog.csdn.net/chenriwei2/article/details/38047119

    SSP或者说是空间金字塔匹配(spatial pyramid matching or SPM)是BoW的一个扩展,它把一张图片划分为从不同的分辨率级别然后聚合这些不同分辨率的图像,在深度学习之前SPM ...

  6. vertica在电信的应用

    本文介绍了什么 ´ 电信级大数据分析典型需求 ´ Vertica数据库特点及与其他数据库对比 ´ Vertica核心技术介绍 ´ 基于Vertica的典型分系统架构简介 电信级大数据分析典型需求 ´  ...

  7. iOS开发流程总结

    本文由社区会员umyueyue分享 以下是会员umyueue总结的iOS开发流程以及学习中的资料分享. 流程:注册.开发.真机测试.发布以及上线. iPhone iOS 4从注册到app上线开发流程 ...

  8. 深入剖析Nginx一点小笔记

    前几天在图书馆看书,恰好看到这本<深入剖析nginx>,花了快一周的时间看完了这本书,写点笔记心得便于以后复习. 以前对nginx的认识就只是停留在一个反向代理服务器上.百度了一下ngin ...

  9. 设置UIButton或者UILabel显示文字的行数

    需要在UIButton的titleLabel或者UILabel的text 字符串里面添加换行符号 “\n”,并且设置 UILabel的numberOfLines属性 栗子:行数要和“\n”的个数对应, ...

  10. Android 环境搭建

    一.Android 环境搭建 开发工具: Android Studio(开发工具,前提是先装 java JDK) 下载地址:http://www.androiddevtools.cn/   Oracl ...