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; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2011-08-26 用户权限管理,LINQ去除它的重复菜单项