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 }
 
分类: .net

ASP.NET MVC企业级项目框架的更多相关文章

  1. asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

    学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...

  2. asp.net mvc 简单项目框架的搭建(二)—— Spring.Net在Mvc中的简单应用

    摘要:上篇写了如何搭建一个简单项目框架的上部分,讲了关于Dal和Bll之间解耦的相关知识,这篇来把后i面的部分说一说. 上篇讲到DbSession,现在接着往下讲. 首先,还是把一些类似的操作完善一下 ...

  3. ASP.NET MVC搭建项目后台UI框架—1、后台主框架

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  4. ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...

  5. ASP.NET MVC搭建项目后台UI框架—2、菜单特效

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  6. ASP.NET MVC搭建项目后台UI框架—3、面板折叠和展开

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  7. ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

  8. 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 ...

  9. ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

随机推荐

  1. js 执行一个字符串类型的函数

    两种方法,一种是加括号一种是加叹号,new Function()的方法没有成功. var a = "function(args){console.log(args)}" undef ...

  2. C++ Primer 学习笔记_41_STL实践与分析(15)--先来看看算法【下一个】

    STL实践与分析 --初窥算法[下] 一.写容器元素的算法 一些算法写入元素值.在使用这些算法写元素时一定要当心.必须.写入输入序列的元素 写入到输入序列的算法本质上是安全的--仅仅会写入与指定输入范 ...

  3. UIMenuController,UIPasteboard:复制,粘贴详细解释

    首先,这四个地图.我想实现的功能.[一张照片讲一个复制到另一UIimageView上] 实现代码例如以下: -(IBAction)panGestureTop:(UILongPressGestureRe ...

  4. 十天学Linux内核之第四天---如何处理输入输出操作

    原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...

  5. DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

    原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...

  6. Custom Data Service Providers

    Custom Data Service Providers Introduction Data Services sits above a Data Service Provider, which i ...

  7. Eclipse UML小工具AmaterasUML的配置和使用

    AmaterasUML是个人认为最好用的Eclipse UML插件,能够通过拖拽Java源文件,轻松生成类图结构.同一时候支持活动图.时序图和用例图. 它的官方下载地址是:http://sourcef ...

  8. SQL Prompt——SQL智能提示插件

    数据库是大家在项目开发中肯定会用到的,C#项目用的最多的就是微软自家的SQL Server了.不可否认,微软的Visual Studio开发平台很好用,很直观的体现就是智能提示.敲几个字符,相关的信息 ...

  9. jQuery的三种bind/One/Live/On事件绑定使用方法

    本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要的朋友参考下   今天浏览jQuery的deprecated列表,发现live()和die()在里面了,赶紧看了一下,发现从jQ ...

  10. crawler_微信采集方案

    仅供参考