先说一说这个项目的背景,是给我校留学生做的一套教务管理系统,我是JAVA出生,C#项目做过之前的管理学院网站,当时的架构是ASP MVC2 + JQGrid + ZTree + 基于AJAX的WCF,基本思路都是从JAVA项目中搬过来的,没有用到C#特有的方法,比如ADO.NET 和 LINQ语句
Dao层主要就是为了与数据库通信,我们当时就直接用C#自带的数据库连接,效率极低,基本每条SQL都是自己写,Entity类似于java中的实体Bean,然后就是负责跳转和数据接收的控制层和为了展现界面的VIEW层。基本上算上三层架构了,但当时为了加快速度开发,代码及其混乱,甚至出现了在Servers层和JS里面写SQL。
我们之前JAVA项目中用的是一个AJAX框架:DWR,我们在网上找到C#类似的框架基于AJAX的WCF,在直接用JS调后台代码。
我们也改了JQGrid和ZTree的源代码,直接写WCF调用的地址和方法就可以使用组件了:D
而现在这个项目的架构我们进行了全方位的改良,架构是Spring.NET + NHibernate + ASP MVC2 + EasyUI ,具体的包结构为下图
因为不知道到时候用哪一个数据库,所以用了一个持久化框架NHibernate,加上Spring.NET对每一个声明对象的管理,开发起来效率比之前高多了。其中,DAO层和Servers层的实例是单例,控制层是原型模式(也就是实现copy)。
当然,为了高效,代码的重用和少错误,我们写了一个C#的代码生成器,用的是C#提供的T4模板技术
对于这个项目的权限验证,之前找了好久的C#过滤器没找到,所以就直接写了一个ascx来判断Session是否为空,后来每一个页面都引感觉不爽,感觉对前台VIEW污染好严重,所以又找了一下,发现在C#又一个对每一个ACTION的拦截器,类似于AOP,在Global.asax写一个内部类,实现ActionFilterAttribute接口,代码如下
public class ValidateModelAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { String OperatorID = Convert.ToString(filterContext.HttpContext.Session["OperatorID"]); if (string.IsNullOrWhiteSpace(OperatorID)) { filterContext.Result = new RedirectResult("/Operator/Login"); } } }
在每一个ACTION前加上用于表示的[ValidateModel],如
[ValidateModel] public ActionResult Index() { string operatorID = Convert.ToString(Session["OperatorID"]); if (StringUtil.IsNotEmpty(operatorID)).......