首页 > 代码库 > c#项目架构搭建经验

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你在忙什麽,你将在你的未来收获什么。】,你是否能达到每天这样做,从毕业一直到离开这个行业,业务时间一直把程序作为你的爱好,它是否在业余时间能成为能让你充实的东西)

        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 Boot35     {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 ThemeProxies2     {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         // Properties10         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         // Methods22         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 EnumInfo10                 {11                     Name = info2.Name12                 };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 = http://www.mamicode.com/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 = http://www.mamicode.com/(int)obj2;28                         break;29 30                     case "System.Int16":31                         item.Value = http://www.mamicode.com/(short)obj2;32                         break;33 34                     case "System.Byte":35                         item.Value = http://www.mamicode.com/(byte)obj2;36                         break;37 38                     case "System.UInt16":39                         item.Value = http://www.mamicode.com/Convert.ToInt32((ushort)obj2);40                         break;41 42                     case "System.UInt32":43                         item.Value = http://www.mamicode.com/(int)obj2;44                         break;45 46                     case "System.UInt64":47                         item.Value = http://www.mamicode.com/(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 : struct56         {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行文规范,缓存分配合理,内存占用合理。

 

本人学术短浅,还是希望更牛的朋友们给点架构方面的建议,意见。