從(cong)微軟(ruan)的(de)(de)DBML文件中我(wo)們(men)能學(xue)到(dao)什么(它告訴了(le)我(wo)們(men)什么是微軟(ruan)的(de)(de)重中之重)~三 分部類是否(fou)破壞(huai)了(le)單一(yi)職(zhi)責
五 LINQ實體類中對屬性的賦值,變化前與變化后SendPropertyChanging與SendPropertyChanged
六 LINQTOSQL中為我們觸發了SendPropertyChanging和SendPropertyChanged,它的真正用意是什么
七 為DBContext對象應該作為其它實體操作類型的基類,并為它提供統一的提交動作
先來看(kan)一(yi)(yi)下“百度百科”對單一(yi)(yi)職(zhi)(zhi)(zhi)責(ze)的(de)(de)定義: 一(yi)(yi)個(ge)(ge)類,只有一(yi)(yi)個(ge)(ge)引起它變化的(de)(de)原因。應該只有一(yi)(yi)個(ge)(ge)職(zhi)(zhi)(zhi)責(ze)。每一(yi)(yi)個(ge)(ge)職(zhi)(zhi)(zhi)責(ze)都(dou)是變化的(de)(de)一(yi)(yi)個(ge)(ge)軸(zhou)線,如果(guo)一(yi)(yi)個(ge)(ge)類有一(yi)(yi)個(ge)(ge)以上的(de)(de)職(zhi)(zhi)(zhi)責(ze),這些職(zhi)(zhi)(zhi)責(ze)就耦(ou)合(he)(he)在了一(yi)(yi)起。這會導致脆弱(ruo)的(de)(de)設計。當一(yi)(yi)個(ge)(ge)職(zhi)(zhi)(zhi)責(ze)發生變化時,可能會影響(xiang)其它的(de)(de)職(zhi)(zhi)(zhi)責(ze)。另(ling)外,多個(ge)(ge)職(zhi)(zhi)(zhi)責(ze)耦(ou)合(he)(he)在一(yi)(yi)起,會影響(xiang)復用性。例如:要實現邏輯和界(jie)面的(de)(de)分離(li)。
分部類(Partial)也算(suan)是(shi)(shi).net的一種新東西,沒有(you)記錯(cuo)應該是(shi)(shi)在(zai)2.0的時候出現(xian)的,MSDN上的定義是(shi)(shi):
可以將(jiang)或(huo)、或(huo)方法的定義拆分到兩個(ge)或(huo)多個(ge)源文件(jian)中。 每(mei)個(ge)源文件(jian)包含類型或(huo)方法定義的一部分,編譯(yi)應用程(cheng)序時將(jiang)把所有部分組合(he)起來(lai)。
我的(de)理解是(shi):當(dang)一(yi)(yi)個(ge)(ge)類(lei)(lei)在一(yi)(yi)個(ge)(ge)時(shi)間(jian)期間(jian)不能完成或不確定完成這(zhe)(zhe)個(ge)(ge)類(lei)(lei)的(de)所(suo)有功能時(shi),可以(yi)先將(jiang)這(zhe)(zhe)個(ge)(ge)類(lei)(lei)定義成partial,它(ta)(ta)允許你在另(ling)一(yi)(yi)個(ge)(ge)地(di)方去(qu)(qu)對(dui)(dui)同一(yi)(yi)個(ge)(ge)類(lei)(lei)進(jin)(jin)行補(bu)充(chong),這(zhe)(zhe)種技術微軟在linq to sql上大大的(de)采用,當(dang)然,由(you)于種種原(yuan)(yuan)因,這(zhe)(zhe)種使用被一(yi)(yi)些(xie)(xie)人(ren)看(kan)來(lai)是(shi)破壞了(le)類(lei)(lei)的(de)單一(yi)(yi)職責原(yuan)(yuan)則,其(qi)實(shi),在我看(kan)來(lai),這(zhe)(zhe)只(zhi)是(shi)對(dui)(dui)同一(yi)(yi)職責的(de)類(lei)(lei),進(jin)(jin)行的(de)一(yi)(yi)個(ge)(ge)補(bu)充(chong),類(lei)(lei)要(yao)完成的(de)還(huan)是(shi)那(nei)些(xie)(xie)事,只(zhi)是(shi)原(yuan)(yuan)來(lai)不確定要(yao)干(gan)什么,或者(zhe)怎么去(qu)(qu)干(gan),而當(dang)它(ta)(ta)知道如何去(qu)(qu)實(shi)現時(shi),可以(yi)定義一(yi)(yi)個(ge)(ge)partial,去(qu)(qu)完善它(ta)(ta)。linq to sql的(de)代碼由(you)IDE自(zi)動生(sheng)成,所(suo)以(yi)有些(xie)(xie)東西對(dui)(dui)于開發人(ren)員是(shi)不夠的(de),而微軟當(dang)然知道這(zhe)(zhe)一(yi)(yi)切(qie),所(suo)以(yi)將(jiang)它(ta)(ta)設計成partial,以(yi)便讓(rang)程(cheng)序員根(gen)據自(zi)己的(de)需要(yao)對(dui)(dui)類(lei)(lei)進(jin)(jin)行補(bu)充(chong),而不是(shi)擴展。
1 [global::System.Data.Linq.Mapping.TableAttribute(Name = "dbo.Web_ExceptionLog")] 2 public partial class Web_ExceptionLog : INotifyPropertyChanging, INotifyPropertyChanged 3 { 4 5 private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty); 6 7 private string _ExceptionID; 8 9 private string _FullInfo; 10 11 private string _Senders; 12 13 private string _HttpMethod; 14 15 private System.DateTime _OccurTime; 16 17 // ……
這(zhe)是IDE自動生成的(de)linq to sql的(de)一個(ge)實體對象(xiang),我們希望將這(zhe)個(ge)類(lei)進行補充(chong),之后的(de)代碼如(ru):
1 public partial class Web_ExceptionLog : Entity.EntityBase 2 { 3 protected override object[] PrimaryKey 4 { 5 get { return new object[] { this.ExceptionID }; } 6 } 7 8 public override IEnumerable<RuleViolation> GetRuleViolations() 9 { 10 throw new NotImplementedException(); 11 } 12 }
所(suo)以說,分部類破壞了(le)類型(xing)的(de)單一職責是不(bu)準(zhun)確的(de),就像好的(de)東西(xi),在不(bu)同的(de)人手(shou)中所(suo)表現出來的(de)力量也(ye)是不(bu)同的(de),道理是一樣的(de)。呵(he)呵(he)。