ASP.NET MVC企业级项目框架
ASP.NET MVC企业级项目框架
MVC项目搭建笔记----
项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,搭建过程内容比较多,结合了抽象工厂的思想降低了三层之间的耦合,可以使用此套框架进行可扩展性要求高的企业级MVC项目开发。本框架的架构图如下:

第一步(创建分类文件夹):
创建5个文件夹。分别为UI,Model,BLL,DAL,Common,以便于将各模块分类整理。
第二步(项目类库的创建):
在UI文件夹创建ASP.NET MVC4项目模板选择基本。
在Model文件夹创建Model类库项目。
在BLL文件夹创建BLL和IBLL类库项目。
在DAL文件夹创建DAL,IDAL,DALFactory类库项目。
在Common文件夹创建Common类库项目。
第三步(创建EF实体):
在数据库管理工具新建一个数据库,在Model层添加一个ADO.Net实体模型。
建好实体模型,右键选择“根据模型生成数据库”,也可以先建好数据库再右键“从数据库更新模型”。
第四步(各层内容的创建,重点!):
在DAL层创建一个EFDbContextFactory类。

1 public class EFDbContextFactory
2 {
3 public static DbContext GetCurrentDbContext()
4 {
5 //单例模式:保证线程实例唯一
6 DbContext db = (DbContext)CallContext.GetData("DbContext");
7 if (db == null)
8 {
9 db = new Model1Container();
10
11 CallContext.SetData("DbContext", db);
12 }
13 return db;
14 }
15 }

在DAL层创建一个BaseDal类,作为所有Dal的基类,封装crud方法。

1 public class BaseDal<T> where T : class , new()
2 {
3 private DbContext db
4 {
5 get
6 {
7 return EFDbContextFactory.GetCurrentDbContext();
8 }
9 }
10 public virtual T Add(T entity)
11 {
12 db.Set<T>().Add(entity);
13 return entity;
14 }
15
16 public virtual bool Update(T entity)
17 {
18 db.Entry(entity).State = EntityState.Modified;
19 return true;
20 }
21
22 public virtual bool Delete(T entity)
23 {
24 db.Entry(entity).State = EntityState.Deleted;
25 return true;
26
27 }
28
29 public virtual int Delete(params int[] ids)
30 {
31 foreach (var item in ids)
32 {
33 var entity = db.Set<T>().Find(item);//如果实体已经在内存中,那么就直接从内存拿,如果内存中跟踪实体没有,那么才查询数据库。
34 db.Set<T>().Remove(entity);
35 }
36 return ids.Count();
37 }
38
39 public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
40 {
41 return db.Set<T>().Where(whereLambda).AsQueryable();
42 }
43
44 public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc)
45 {
46 total = db.Set<T>().Where(whereLambda).Count();
47 if (isAsc)
48 {
49 return
50 db.Set<T>()
51 .Where(whereLambda)
52 .OrderBy(orderbyLambda)
53 .Skip(pageSize * (pageIndex - 1))
54 .Take(pageSize)
55 .AsQueryable();
56 }
57 else
58 {
59 return
60 db.Set<T>()
61 .Where(whereLambda)
62 .OrderByDescending(orderbyLambda)
63 .Skip(pageSize * (pageIndex - 1))
64 .Take(pageSize)
65 .AsQueryable();
66 }
67 }
68 }

在DAL层添加Dal类的T4模板(Dal类生成模板,生成各Dal类,包括继承类和接口,未给出,可自行编写)。T4模板生成的Dal类内容模板如下:
1 public partial class UserInfoDal : BaseDal<UserInfo>,IUserInfoDal
2 {
3
4 }
在IDAL层添加IDal接口类的T4模板(未给出,自行编写)。T4模板生成的IDal类内容模板如下:
1 public partial interface IUserInfoDal :IBaseDal<UserInfo>
2 {
3
4 }
在IDAL层添加IBaseDal接口类,作为IDal的基接口类,子接口只要继承此接口就可以实现crud(增删改查)及分页接口。

1 public interface IBaseDal<T>
2 {
3 T Add(T entity);
4 bool Update(T entity);
5 bool Delete(T entity);
6 int Delete(params int[] ids);
7 IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
8 IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc);
9 }

在IDAL层添加IDbSession接口类(此类作为DbSession类的约束,符合抽象的思想,不直接返回对象本身,而是返回他的接口,这样就不会直接对对象本身造成依赖,只要修改IDbSession)的T4模板(未给出,自行编写)。T4模板生成的IDbSession类内容模板如下:
1 public partial interface IDbSession
2 {
3 IUserInfoDal UserInfoDal { get; }
4 int SaveChanges();
5 }
在DALFactory层添加DbSession类的T4模板(未给出,自行编写)。T4模板生成的DbSession类内容模板如下:

1 public partial class DbSession :IDbSession
2 {
3
4 private IUserInfoDal _UserInfoDal;
5 public IUserInfoDal UserInfoDal {
6 get {
7 if (_UserInfoDal == null)
8 {
9 _UserInfoDal =new UserInfoDal();
10 }
11 return _UserInfoDal;
12 }
13 }
14
15 public int SaveChanges()
16 {
17 //这里只需要调用当前线程内部的上下文SaveChange。
18 DbContext dbContext = EFDbContextFactory.GetCurrentDbContext();
19 return dbContext.SaveChanges();
20 }
21 }

在DALFactory层添加DbSessionFactory类,作为dbSession的工厂。

1 public class DbSessionFactory
2 {
3 public static IDbSession GetDbSession()
4 {
5 IDbSession dbSession = (IDbSession) CallContext.GetData("DbSession");
6 if (dbSession == null)
7 {
8 dbSession = new DbSession();
9 CallContext.SetData("DbSession", dbSession);
10 return dbSession;
11 }
12 return dbSession;
13 }
14 }

在IBLL层创建IBaseService基接口类,作为所有IService接口类的crud公共约束。

1 public interface IBaseService<T>
2 {
3 T Add(T entity);
4 bool Update(T entity);
5 bool Delete(T entity);
6 int Delete(params int[] ids);
7 IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
8
9 IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total,
10 Expression<Func<T, bool>> whereLambda
11 , Expression<Func<T, S>> orderbyLambda, bool isAsc);
12 int Savechanges();
13 }

在IBLL层添加IBLL接口类的T4模板(未给出,自行编写)。T4模板生成的IBLL接口类内容模板如下:
1 public partial interface IUserInfoService :IBaseService<UserInfo>
2 {
3
4 }
在BLL层创建BaseService类(作为所有Service类的基类,封装crud方法)。

1 public partial class UserInfoService:BaseService<UserInfo>,IUserInfoService
2 {
3 public override void SetCurrentDal()
4 {
5 CurrentDal = DbSession.UserInfoDal;
6 }
7 }

第五步(配置Spring.Net框架):
在UI层添加lib文件夹(用于存放所有外部引用文件),将Spring.Net程序集文件夹放到lib文件夹下,UI层添加对Spring.Core,Spring.Web,Spring.Web.Extensions,Spring.Web.Mvc4程序集的引用。
在Global.asax文件里将MvcApplication类继承至SpringMvcApplication。
在Web.config文件里的<configuration>下的<configSections>节点下添加:

1 <!--Spring配置节点-->
2 <sectionGroup name="spring">
3 <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
4 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
5 </sectionGroup>
6 <!--Spring配置节点结束-->

在Web.config文件里的<configuration>节点下添加:

1 <!--Spring配置节点-->
2 <spring>
3
4 <context>
5 <!--选择XML文件的位置,3种方式,1 配置文件 2 定位文件 3 程序集-->
6 <!--<resource uri="config://spring/objects"/>-->
7 <!--resource uri="file://ServiceXml.xml"/-->
8 <!--resource uri="file://Controllers.xml"/-->
9 <resource uri="assembly://MyOA_BLL/MyOA_BLL/ServiceXml.xml"/>
10 <resource uri="assembly://MyOA/MyOA/Controllers.xml"/>
11 <!--<resource uri="assembly://SpringNetTest/SpringNetTest/objects1.xml"/>-->
12 </context>
13 <objects xmlns="http://www.springframework.net">
14
15 </objects>
16
17 </spring>
18 <!--Spring配置节点结束-->

第六步(注入Service对象):
在BLL层添加生成ServiceXml配置文件的T4模板(Speing.Net属性注入方法请参见 http://www.cnblogs.com/sunniest/p/4125561.html ),内容模板为:

1 <objects xmlns="http://www.springframework.net">
2 <object name="UserInfoService" type="MyOA_BLL.UserInfoService, MyOA_BLL" singleton="false">
3
4 </object>
5
6 </objects>

在Controller文件夹下的各Controller类中添加
1 public IUserInfoService UserInfoService{get;set;}
2 IDbSession session = DbSessionFactory.GetDbSession();
用UserInfoService来调用业务逻辑的方法(通过Spring.net注入UserInfoService对象),在操作完成后用session的savechanges方法控制将对实体的操作保存到数据库中。
在UI层添加Controller.xml文件(用于向Controller类注入UserInfoService对象),内容模板为:

1 <objects xmlns="http://www.springframework.net">
2 <object name="TestController" type="MyOA.Controllers.TestController, MyOA" singleton="false">
3 <property name="UserInfoService" ref="UserInfoService" />
4 </object>
5
6 </objects>

至此项目基本框架搭建完成!
Controller调用业务逻辑层完整代码示例:

1 public ActionResult Test()
2 {
3 return View();
4 }
5
6 [HttpPost]
7 public ActionResult Test(string uname,string pwd)
8 {
9 UserInfo u =new UserInfo();
10 u.UserName=uname;
11 u.Pwd=pwd;
12 var t = UserInfoService.Add(u);
13 session.SaveChanges();
14 if(t.Id>0){
15 return Content("注册成功!");
16 }
17 else{
18 return Content("注册失败!");
19 }
20 }

ASP.NET MVC企业级项目框架的更多相关文章
- asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦
学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...
- asp.net mvc 简单项目框架的搭建(二)—— Spring.Net在Mvc中的简单应用
摘要:上篇写了如何搭建一个简单项目框架的上部分,讲了关于Dal和Bll之间解耦的相关知识,这篇来把后i面的部分说一说. 上篇讲到DbSession,现在接着往下讲. 首先,还是把一些类似的操作完善一下 ...
- ASP.NET MVC搭建项目后台UI框架—1、后台主框架
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询
ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...
- ASP.NET MVC搭建项目后台UI框架—2、菜单特效
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
随机推荐
- lua三底漆:lua转让c/c++库(动态链接模式)
dll按功能luaL_openlib出口,然后lua使用package.loadlib导入库函数,基本就是这么个过程,以下上代码来说明一切. #include "stdafx.h" ...
- href="javascript:void(0);"与#差异
将<a>标签设置为空链接有两种方式.第一个是href="#",第二个是href="javascript:void(0);". 两种方式都设置了标签为 ...
- uva 11572 - Unique Snowflakes(和书略有不同)
本书是关于使用刘汝佳set, 通过收集找到.count()和删除.erase().这种方法比我好.用较短的时间. 我想map这个任务可以完成.但是,这是不容易删除,必须先找到find()标.然后删除索 ...
- ios 串
1.是推断包括字符串 if( [str rangeOfString:@"hello"].location != NSNotFound) { NSLog(@"yes&quo ...
- 【Java编码准则】の #02不要在client存储未加密的敏感信息
当构建CS模式的应用程序时,在client側存储敏感信息(比如用户私要信息)可能导致非授权的信息泄漏. 对于Web应用程序来说,最常见的泄漏问题是在client使用cookies存放server端获取 ...
- hadoop2.0的datanode数据存储文件夹策略的多个副本
在hadoop2.0在,datanode数据存储盘选择策略有两种方式复制: 首先是要遵循hadoop1.0磁盘文件夹投票,实现类:RoundRobinVolumeChoosingPolicy.java ...
- android之Fragment(官网资料翻译)
Fragment要点 Fragment作为Activity界面的一部分组成出现 能够在一个Activity中同一时候出现多个Fragment,而且,一个Fragment亦可在多个Activity中使用 ...
- Python开发一个csv比较功能相关知识点汇总及demo
Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...
- 小工具:内存监视器(SystemMonitor)
卸了360之后,与之捆绑的加速球也没了.加速球可以查看剩余内存量,清理残留进程,有的时候不觉得这小玩意有多大作用,卸了之后才知道后悔. 加速球的替代方案比比皆是,如Windows自带的任务管理器,窗口 ...
- Use PRODUCT_USER_PROFILE To Limit User
The PRODUCT_USER_PROFILE (PUP) table provides product-level security that supplements the user-level ...