在面向對象的「封裝閉合性」開發原則中,一貫提倡的是把獨立的功能封裝在一個類裏面的!但從Visual Studio 2005開發,系統提供了一個分部類的開發方式一直受到爭議,不少人認爲把同一類的功能分佈不一樣的文件中,是打破了「封裝閉合原則」,一個類的功能變得難以管理,大多數人都是在無奈的狀況下才使用到分部類的方式。但在winFrom類、頁面類、DataSet裏面你常常能夠發現分部類的身影,當你用到Entity Framework的時候,你會發現每一個映射生成的對象都是使用分部類的方式生成的,分部相似乎早已派上用場。分部類究竟有什麼好處,下面爲你們一一揭露。數據庫
1、分部類架構
根據微軟的定義,分部類就是「將類或結構、接口或方法的定義拆分到兩個或多個源文件中。 每一個源文件包含類型或方法定義的一部分,編譯應用程序時將把全部部分組合起來」。在使用分部類的時候,必須爲類加入partial的關鍵字,注意每一個類的可訪問性必須一致,其中一類爲public,其餘類也必須爲public。若是其中一個類爲抽象類,那合併後整個類都將被視爲抽象類,其中一個類爲密封類,那合併後整個類都將視爲密封類。app
1 publicpartialclass PersonManager
2 {
3 public Person GetPersonById(int id)
4 {
5 }
6 }
7
8 publicpartialclass PersonManager
9 {
10 public List<Person> GetList()
11 {
12 }
13 }
在合併的時候,整體類全把全部的基類和特性合併繼承。要注意的是分部類必須在於同一個程序集當中,並且關鍵字不得相沖,若是一個類上爲public ,另外一個類爲private,那將會出錯。在第二個分部類中能夠調用第一個分部類中所定義的字段與方法。工具
1 [SerializableAttribute]
2 public partialclass Person { }
3
4 [ObsoleteAttribute]
5 public partialclass Person { }
6
7 //合併後至關於
8 [SerializableAttribute]
9 [ObsoleteAttribute]
10 class Person{ }
11
12
13 partialclass PersonManager:Manager{ }
14
15 partialclass PersonManager:Collection{ }
16
17 //合併後至關於
18 class PersonManager:Manager,Collection{ }
2、分部方法網站
分部方法與分部類十分相像,方法必須包含partial關鍵字,若是一個類中並不包含該方法的實現,而另外一個類中實現了該方法,將不會影響這個方法的正常運行。這個特色跟接口有殊途同歸之妙,特別是在使用代碼生成器的時候,開發人員可使用工具生成分部方法,而後手動去實現方法。分部方法有如下幾個限制,第一方法必須返回void,只能默認爲private;第二,分部方法不能爲virtual和extern方法;第三,分部方法能夠有ref參數,但不能有out參數;this
1 partial void PersonChanged(Person person);
2
3 partial void PersonChanged(Person person)
4 {
5 PersonManager personManager=new PersonManager();
6 personManager.Update(person);
7 ......
8 }
關於分部類與分部方法,在微軟的官方網站上有着詳細介紹,在這裏很少做說明。而下面在下想介紹一下分部類與分部方法的實際用途,這纔是我寫這章文件的真的目的。spa
3、分部類與分部方法的可用性設計
LINQ是微軟在Framewrok3.0開發推出的新產品,其中LINQ TO SQL是實現對象與數據表相映射的神奇工具。隨着Framework 4.0面世,Entity Framework成爲微軟項目中實現ORM的主要手段,當中*.edmx文件中使用的都是分部類的實現方式。這是由於映射過程是自動生成的,代碼必須符合定製的規則,當須要爲對象添加一些額外的屬性,而這些屬性無需保存到數據庫的時候,分部類就派上用場,咱們可使用分部類爲對象提供各類的自定義屬性。code
特別是在使用DDD領域驅動設計的時候,分部類成爲實現模型動做的一個好方法。失血模型與充血模型是DDD長久爭議的話題,在失血模型中,模型是不該該具有動做,而是把動做放在Service層中,而在充血模型中,模型類應該具備各自的方法,而「分部類」就是實現充血模型方法的一種好手段。對象
1 //Model.Designer.cs文件
2 [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(
3 NamespaceName="BusinessModel", Name="Approve")]
4 [global::System.Runtime.Serialization.DataContractAttribute(IsReference=true)]
5 [global::System.Serializable()]
6 public partial class Approve : global::System.Data.Objects.DataClasses.EntityObject
7 {
8 /// <summary>
9 /// 建立新的 Approve 對象。
10 /// </summary>
11 /// <param name="id">ID 的初始值。</param>
12 /// <param name="functionType">FunctionType 的初始值。</param>
13 [global::System.CodeDom.Compiler.GeneratedCode("
14 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
15 public static Approve CreateApprove(int id, int functionType)
16 {
17 Approve approve = new Approve();
18 approve.ID = id;
19 approve.FunctionType = functionType;
20 return approve;
21 }
22 /// <summary>
23 /// 架構中不存在屬性 ID 的任何註釋。
24 /// </summary>
25 [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(
26 EntityKeyProperty=true,IsNullable=false)]
27 [global::System.Runtime.Serialization.DataMemberAttribute()]
28 [global::System.CodeDom.Compiler.GeneratedCode(
29 "System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
30 public int ID
31 {
32 get
33 {
34 return this._ID;
35 }
36 set
37 {
38 this.OnIDChanging(value);
39 this.ReportPropertyChanging("ID");
40 this._ID = global::System.Data.Objects.DataClasses
41 .StructuralObject.SetValidValue(value);
42 this.ReportPropertyChanged("ID");
43 this.OnIDChanged();
44 }
45 }
46 [global::System.CodeDom.Compiler.GeneratedCode("
47 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
48 private int _ID;
49 [global::System.CodeDom.Compiler.GeneratedCode("
50 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
51 partial void OnIDChanging(int value);
52 [global::System.CodeDom.Compiler.GeneratedCode("
53 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
54 partial void OnIDChanged();
55 /// <summary>
56 /// 架構中不存在屬性 FunctionType 的任何註釋。
57 /// </summary>
58 [global::System.Data.Objects.DataClasses
59 .EdmScalarPropertyAttribute(IsNullable=false)]
60 [global::System.Runtime.Serialization.DataMemberAttribute()]
61 [global::System.CodeDom.Compiler.GeneratedCode(
62 "System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
63 public int FunctionType
64 {
65 get
66 {
67 return this._FunctionType;
68 }
69 set
70 {
71 this.OnFunctionTypeChanging(value);
72 this.ReportPropertyChanging("FunctionType");
73 this._FunctionType = global::System.Data.Objects.DataClasses
74 .StructuralObject.SetValidValue(value);
75 this.ReportPropertyChanged("FunctionType");
76 this.OnFunctionTypeChanged();
77 }
78 }
79 [global::System.CodeDom.Compiler.GeneratedCode("
80 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
81 private int _FunctionType;
82 [global::System.CodeDom.Compiler.GeneratedCode("
83 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
84 partial void OnFunctionTypeChanging(int value);
85 [global::System.CodeDom.Compiler.GeneratedCode("
86 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
87 partial void OnFunctionTypeChanged();
88 /// <summary>
89 /// 架構中不存在屬性 Title 的任何註釋。
90 /// </summary>
91 [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()]
92 [global::System.Runtime.Serialization.DataMemberAttribute()]
93 [global::System.CodeDom.Compiler.GeneratedCode("
94 System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
95 public string Title
96 {
97 get
98 {
99 return this._Title;
100 }
101 set
102 {
103 this.OnTitleChanging(value);
104 this.ReportPropertyChanging("Title");
105 this._Title = global::System.Data.Objects.DataClasses
106 .StructuralObject.SetValidValue(value, true);
107 this.ReportPropertyChanged("Title");
108 this.OnTitleChanged();
109 }
110 }
111 ...............................
112 }
113
114 //分部類
115 public partial class Approve
116 {
117 //添加屬性
118 public string Type
119 {
120 get;set;
121 }
122
123 //添加動做
124 public void AddReport(Report report)
125 {.......}
126 .................
127 }
在下也是在使用分部類對Entity Framework模型進行開發的時候才注意到分部類, 文章的目的主要是想介紹分部類在Entity Framework開發過程當中的做用,敬請點評