EF架構~DefaultValue讓(rang)我的UnitOfWork更(geng)可讀(du)
在編程世界里,使用“否定式”不是一件好事,因為它的可讀性并不高,但有時,為了(le)讓使用者減(jian)少(shao)代碼量,還是使用了(le)雙重否定,直(zhi)到(dao)DefaultValue的出現,它改變了(le)這一切,它可以為你的屬性設置(zhi)你想要的默(mo)認值,如bool類型(xing)默(mo)認值是false,而如果你希望它的默(mo)認值是true,就需要用到(dao)DefaultValue這個特性了(le)。
這是我IUnitOfWork代(dai)碼(ma)片(pian)斷(duan)
/// <summary> /// 工作單元 /// 提供一個保存方法,它(ta)可以對調用層公(gong)開,為了減少(shao)連(lian)庫次(ci)數(shu) /// </summary> public interface IUnitOfWork { /// <summary> /// 將操作(zuo)提交到(dao)數據(ju)庫, /// </summary> void Save(); /// <summary> /// 是否不提交到數據庫 /// 默(mo)認為false,即默(mo)認為提交到數據庫 /// </summary> /// <returns></returns> bool IsNotSubmit { get; set; } } /// <summary> /// 工作單元 /// 對泛型類型的支(zhi)持 /// </summary> /// <typeparam name="T"></typeparam> public interface IUnitOfWork<T> : IUnitOfWork where T : class { }
上(shang)面代碼的(de)IsNotSubmit就是一個否定式的(de),這不(bu)是我們推薦的(de),但沒(mei)辦法,使(shi)用它,可(ke)以簡化(hua)代碼!它的(de)意思(si)是不(bu)把(ba)修(xiu)改(gai)提交到數據(ju)庫,bool類型默(mo)認是false
,也(ye)就是(shi)說,它默認是(shi)把修改(gai)提交的數據庫(ku),怎么樣,挺繞吧,呵呵。
當DefaultValue出現(xian)后,就改(gai)變(bian)了這一切(qie),你可以這樣定(ding)義它了
public interface IUnitOfWork { /// <summary> /// 將操作提(ti)交到數(shu)據(ju)庫, /// </summary> void Save(); /// <summary> /// 是否(fou)提交(jiao)到數據庫 /// 默認為true,即(ji)默認為提交到數據庫 /// </summary> /// <returns></returns> [DefaultValue(true)] bool IsSubmit { get; set; } }
這樣的接(jie)口定義意思就很清(qing)晰了,IsSubmit就是提交,true就是提交,false就是不(bu)提交,多清(qing)晰呀,呵呵!
再(zai)來(lai)看(kan)如何得到IsSubmit的值(zhi),如果(guo)直接使用它結果(guo)還會是false,你需要反射一下(xia),從TypeDescriptor里得到它的值(zhi)才是DefaultValue,呵呵
/// <summary> /// 數據上下(xia)文(wen) /// </summary> class DataContext : IUnitOfWork { #region IUnitOfWork 成員 public void Save() { throw new NotImplementedException(); } /// <summary> /// 類不會(hui)繼承接(jie)口的(de)特(te)性信(xin)息 /// </summary> [DefaultValue(true)] public bool IsSubmit { get; set; } #endregion }
好,我(wo)們現在輸出一下(xia)信息(xi),看(kan)看(kan)IsSubmit的值
AttributeCollection attrColl = TypeDescriptor.GetProperties(new DataContext())["IsSubmit"].Attributes; DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute; bool _Value = (bool)attr.Value; Console.WriteLine(_Value);
結果:
怎么樣,現在程序中可以把否定式(shi)去掉了吧(ba),呵(he)呵(he)
而將這個技術應(ying)用到(dao)我(wo)們(men)的架構中,可以這樣來實現:(如(ru)果為IsSubmit設置了新(xin)值(zhi),就(jiu)(jiu)使用新(xin)值(zhi),如(ru)果沒有設置,那就(jiu)(jiu)用默(mo)認值(zhi),大家可以使用default(bool)得到(dao)bool類型的默(mo)認值(zhi),同理default(string)就(jiu)(jiu)是字符(fu)型的)
private bool isSubmit; /// <summary> /// 類不(bu)會繼承接口的(de)特性信(xin)息 /// </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; } }