c#項目架構搭建經驗
讀過.Net項目中感覺代碼寫的不錯(備注1)有:bbsMax(可惜唧唧喳喳鳥像消失了一樣),Umbraco(國外開源的cms項目),Kooboo(國內做開源cms)。本人狹隘,讀的代碼不多,范圍也不廣泛。
你是否一直渴望自己能開發出一套系統架構,讓人讀起來感覺到程序有條理,結構很合理。
好的架構師需要具備:
1.項目經驗豐富。(應該是從一堆堆項目中走出來的,豐富的經驗比大篇大論的理論更深刻。)
2.知識的全面性,基礎的扎實程度。(知識的全面性不要求你什麼都知道,起碼要能熟練掌握WCF,Silerlight,WebService,WindowService,Asp.net,WinForm,Asp.net Mvc,ORM(Entity Framework,Linq,NHibernate)DI/IOC(Autofac,Unity,Cast),Javascript(javascript能自己封裝類庫,很熟練jquery),Ajax(js幫助方式,AjaxPanel),OAuth(Open Identity),OData等)
3.會從不同的角度去了解問題。(但不必什麼語言都懂,起碼你不能只懂一種技術,當你去讀不同語言實現的架構時會給你帶來不一樣的感覺,處理事情的方式。比如:Django,或者Ruby On Rails,可以讓你能了解到MVC架構的真谛,在讀Java的struts的感覺又是不同的感覺)
4.熟練應用的設計模式。(行為模型,結構模式,創建型模式)
5.對程序有濃厚的興趣。(如果你只把程序當作換取收入的一種技能,估計很難成為資深級別;業余時間【晚上8:00到10:00你在忙什麽,你將在你的未來收獲什麼。】(備注2),你是否能達到每天這樣做,從畢業一直到離開這個行業,業務時間一直把程序作為你的愛好,它是否在業余時間能成為能讓你充實的東西)
6.理科是否優秀。(不管你信不信,如果你理科不好,計算機技術你成為高手會很漫長)
怎麼搭建c#項目架構像計算機一樣運行的計算機
1.Boot.cs,它應該在工程中出現在什麼位置,它能做什麼事情。
配置信息管理類的初始化(加載)。。。
系統信息管理類的初始化(加載)。。。
業務訂閱實現的初始化(加載)。。。
系統適配管理類初始化(加載)。。。
模版引擎初始化(加載)。。。
theme管理類初始化(加載)。。。
plugin管理類初始化(加載)。。。
widget管理類初始化(加載)。。。
數據操作實現類初始化(加載)。。。
等等
實現示例:
1 protected void Application_BeginRequest(object sender, EventArgs e)
2 {
3 if (false == hasInit)
4 {
5 lock (locker)
6 {
7 if (false == hasInit)
8 {
9 // 第一次HttpApplicaiton初始實例化時,啟動Boot類中全局靜態型變量信息
10 // AllEnums初始化:包含Enum屬性,字段,注解信息,避免每次使用enum上下文信息時都動態創建;
11 // AllSettings初始化:避免全局唯一配置管理類多次初始化,保證應用程序池中保留一份對象實例
12 // 配置信息管理類的初始化(加載)。。。
13 // 系統信息管理類的初始化(加載)。。。
14 // 業務訂閱實現的初始化(加載)。。。
15 // 系統適配管理類初始化(加載)。。。
16 // 模版引擎初始化(加載)。。。
17 // theme管理類初始化(加載)。。。
18 // plugin管理類初始化(加載)。。。
19 // widget管理類初始化(加載)。。。
20 // 數據操作實現類初始化(加載)。。
21 Boot.Init();
22 }
23 }
24 }
25
26 // 每次http請求開始時,都需要初始化http上下文包裝類
27 AppContext.Init();
28 。。。。。。
29 }
30
31 /// <summary>
32 /// 啟動時
33 /// </summary>
34 public class Boot
35 {
36 /// <summary>
37 /// 初始化。。。
38 /// </summary>
39 public static void Init()
40 {
41 // 全局系統變量加載
42 Globals.Init();
43
44 // 全局唯一配置信息加載
45 SettingsManager.Init();
46
47 // 全局Enums上下文加載
48 AllEnums.Init();
49 // 全局配置信息
AllSettings.Init();
50 // 初始化Theme代理實現類
51 ThemeProxies.Proxies.Clear();
52 ThemeProxies.Proxies.Add(new DefaultThemeProxy());
53 。。。。。。
54 }
55 }
皮膚管理示例:
1 public interface IThemeProxy
2 {
3 List<Theme> Load();
4
5 List<TemplateInfo> Load(string dir);
6
7 string Load(string file);
8
9 Theme GetDefault();
10
11 void SetDefault(Theme theme);
12
13 void Delete(Theme theme);
14
15 void Upload(Theme theme);
16
17 void Save(string file, string fileContext);
18 }
1 public class ThemeProxyCollection : Collection<IThemeProxy>
2 {
3
4 }
復制代碼
1 public class ThemeProxies
2 {
3 public static ThemeProxyCollection Proxies = new ThemeProxyCollection() {
4 new DefaultThemeProxy()
5 };
6 }
2.AppContext.cs,它扮演什麼角色,它能做什麼事情。
皮膚管理,
錯誤、跟蹤信息處理,
存放、獲取上下文臨時變量,
當前訪問用戶(基本賬戶信息,權限信息),
等等
3.Global.cs(AppRuntime.cs),看到這個類,你能想到它能做什麼,在系統架構中他該扮演什麼作用。
系統參數信息。。。
config配置信息。。。
系統路徑快速獲取幫助函數。。。
4.系統配置,系統經常出現的Enum類型,怎麼管能讓你的系統感覺到整潔。
AllEnums.cs來維護全局enum的上下文。。。
AllSettings.cs來維護全局配置信息。。。
等等
1 /// <summary>
2 /// 全局enum對象成員信息管理類
3 /// </summary>
4 public class AllEnums
5 {
6 public AllEnums()
7 {
8 }
9
10 public static EnumInfoCollection CategoriesTypeMembers { get; set; }
11
12 /// <summary>
13 /// 初始化全局enum對象成員信息
14 /// </summary>
15 public static void Init()
16 {
17 CategoriesTypeMembers = EnumUtil.GetEnumItems(typeof(CategoriesType));
18
19 }
20 }
1 public class EnumInfo : IPrimaryKey<string>
2 {
3 // Methods
4 public string GetKey()
5 {
6 return this.Name;
7 }
8
9 // Properties
10 public string DefaultValue { get; set; }
11
12 public string Description { get; set; }
13
14 public string Name { get; set; }
15
16 public object Value { get; set; }
17 }
18
19 public class EnumInfoCollection : Collection<EnumInfo>
20 {
21 // Methods
22 public EnumInfoCollection()
23 {
24 }
25
26 public EnumInfoCollection(EnumInfoCollection items)
27 {
28 if (items != null)
29 {
30 foreach (EnumInfo info in items)
31 {
32 base.Add(info);
33 }
34 }
35 }
36 }
1 public enum CategoriesType : int
2 {
3 [Description("文章欄目")]
4 [DefaultValue(0)]
5 Article,
6
7 [Description("產品欄目")]
8 [DefaultValue(1)]
9 Product,
10
11 [Description("下載欄目")]
12 [DefaultValue(0)]
13 Dowload,
14
15 [Description("圖片欄目")]
16 [DefaultValue(0)]
17 Images,
18
19 }
1 public class EnumUtil
2 {
3 public static EnumInfoCollection GetEnumItems(Type enumType)
4 {
5 EnumInfoCollection infos = new EnumInfoCollection();
6 FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
7 foreach (FieldInfo info2 in fields)
8 {
9 EnumInfo item = new EnumInfo
10 {
11 Name = info2.Name
12 };
13 DescriptionAttribute[] customAttributes = (DescriptionAttribute[])info2.GetCustomAttributes(typeof(DescriptionAttribute), true);
14 if ((customAttributes != null) && (customAttributes.Length > 0))
15 {
16 item.Description = customAttributes[0].Description;
17 }
18 DefaultValueAttribute[] attributeArray2 = (DefaultValueAttribute[])info2.GetCustomAttributes(typeof(DefaultValueAttribute), true);
19 if ((attributeArray2 != null) && (attributeArray2.Length > 0))
20 {
21 item.DefaultValue = attributeArray2[0].Value as string;
22 }
23 object obj2 = enumType.InvokeMember(info2.Name, BindingFlags.GetField, null, null, null);
24 switch (Enum.GetUnderlyingType(enumType).FullName)
25 {
26 case "System.Int32":
27 item.Value = (int)obj2;
28 break;
29
30 case "System.Int16":
31 item.Value = (short)obj2;
32 break;
33
34 case "System.Byte":
35 item.Value = (byte)obj2;
36 break;
37
38 case "System.UInt16":
39 item.Value = Convert.ToInt32((ushort)obj2);
40 break;
41
42 case "System.UInt32":
43 item.Value = (int)obj2;
44 break;
45
46 case "System.UInt64":
47 item.Value = (int)obj2;
48 break;
49 }
50 infos.Add(item);
51 }
52 return infos;
53 }
54
55 public static bool TryParse<T>(string memberName, out T t) where T : struct
56 {
57 t = default(T);
58 return (!memberName.IsNullOrEmpty() && Enum.TryParse<T>(memberName, true, out t));
59 }
60
61 }
5.數據操作類,能怎麼處理讓DataAccess層更規范。
6.Plugin怎麼管理。
7.Widgets怎麼管理。
8.你是否還在死守Dao,Business,Web,Entity(Model)這樣的分層結構,這種從Foosun.Net(cms),PetShop流傳出來的結構,是否毒害了你對程序的結構的創想。
9.Template Engin,你是否嘗試去處理實現過,請拋棄NVelocity帶給你的毒害。是能否從Discuzz!NT中獲得點靈感。或者Asp.net mvc模版運行原理你是否清晰,實現原理是否能找到核心代碼實現處。
10. 偽靜態,原理,實現。是否嘗試過用。
11. 靜態HTML生成系統你是否嘗試用,自己是否嘗試過寫。
12. 接口類,抽象類,實現類,管理類,代理類,創建型類,行為型類,裝飾型類,實體型類,枚舉類等,你是否在程序創建類時對他們命名,文件存放位置,結構劃分有過深思熟慮。