c#項目架構搭建經驗

         讀過.Net項目中感受代碼寫的不錯(備註1)有:bbsMax(惋惜唧唧喳喳鳥像消失了同樣),Umbraco(國外開源的cms項目),Kooboo(國內作開源cms)。本人狹隘,讀的代碼很少,範圍也不普遍。javascript

         你是否一直渴望本身能開發出一套系統架構,讓人讀起來感受到程序有條理,結構很合理。html

         好的架構師須要具有:

        1.項目經驗豐富。(應該是從一堆堆項目中走出來的,豐富的經驗比大篇大論的理論更深入。)java

        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等)jquery

        3.會從不一樣的角度去了解問題。(但沒必要什麼語言都懂,起碼你不能只懂一種技術,當你去讀不一樣語言實現的架構時會給你帶來不同的感受,處理事情的方式。好比:Django,或者Ruby On Rails,可讓你能瞭解到MVC架構的真諦,在讀Java的struts的感受又是不一樣的感受)算法

        4.熟練應用的設計模式。(行爲模型,結構模式,建立型模式)sql

        5.對程序有濃厚的興趣。(若是你只把程序看成換取收入的一種技能,估計很難成爲資深級別;業餘時間【晚上8:00到10:00你在忙什麼,你將在你的將來收穫什麼。】(備註2),你是否能達到天天這樣作,從畢業一直到離開這個行業,業務時間一直把程序做爲你的愛好,它是否在業餘時間能成爲能讓你充實的東西)c#

        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     }
View Code
1   public class ThemeProxyCollection : Collection<IThemeProxy>
2     {
3 
4     }
View Code
1  public class ThemeProxies
2     {
3         public static ThemeProxyCollection Proxies = new ThemeProxyCollection() { 
4            new  DefaultThemeProxy()
5         };
6     }
View Code

 

        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     }
View Code
 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     }
View Code
 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     }
View Code

 

 

        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. 接口類,抽象類,實現類,管理類,代理類,建立型類,行爲型類,裝飾型類,實體型類,枚舉類等,你是否在程序建立類時對他們命名,文件存放位置,結構劃分有過深思熟慮。

 

備註1:

什麼代碼算上好:

1,代碼書寫規範;

2,代碼結構合理;

3,代碼變量,函數,類,命名空間,項目名稱規範;

4,代碼註釋完整;

5,對靜態接口類,抽象類等使用的地道。

6,設計模式,用的典型,經典。

7,代碼執行效率高,算法優。

8,數據訪問處理恰當,sql行文規範,緩存分配合理,內存佔用合理。

備註2(但願你們不要誤解) 

1.胡適先生畢業典禮講話:「一我的的業餘時間用來作什麼,就決定了他的未來」;

2.愛因斯坦說:「一我的活到六七十歲,大概有13年作工做,有17年是業餘時間,此外是吃飯睡覺的時間。一我的能不能成才,關鍵在於利用你的17年,可以利用業餘時間的人就能成才,不然就不能成才。」

  

本人學術短淺,仍是但願更牛的朋友們給點架構方面的建議,意見。

看到這個哥們的文章中截圖不錯:

http://www.cnblogs.com/mienreal/tag/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/

積累好文章:http://www.cnblogs.com/mienreal/p/4340864.html(經驗豐富的架構,產品人發的文章)

相關文章
相關標籤/搜索