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. LVM pvcreate,vgcreate,lvcreate,mkfs

    首先介绍LVM的几个概念:     1. 物理卷Physical volume (PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file).物理卷包 ...

  2. 【蓝桥杯】 PREV-1 核桃数

    主题链接:http://lx.lanqiao.org/problem.page?gpid=T24   历届试题 核桃的数量   时间限制:1.0s   内存限制:256.0MB        问题描写 ...

  3. 使用RESTClient插件数据模拟(GET,POST)提交

    1:在Firefox下载RESTClient插件安装 2:安装界面后, 3:点击设置头文件:(设请求地址有头部文件) 4:设置界面,当然有非常多选择.依据你的须要.一般在输入的时候有智能提示,我这里以 ...

  4. Linux进程的状态转换图

    http://blog.csdn.net/mu0206mu/article/details/7348618 ◆运行状态(TASK_RUNNING) 当进程正在被CPU执行,或已经准备就绪随时可由调度程 ...

  5. CocoaChina 第四个测试

    1. iOS同意近期本地通知数量最大为多少? A.64 B.32 C.128 D.16 2. int x = 1; int y = 2; int z = x^y*y; NSLog(@"%d& ...

  6. poj 1698 Alice&#39;s Chance 拆点最大流

    将星期拆点,符合条件的连边,最后统计汇点流量是否满即可了,注意结点编号. #include<cstdio> #include<cstring> #include<cmat ...

  7. java 中间String分类

    String a = "aaa"; 用这样的方式的时候java首先在内存中寻找"aaa"字符串.假设有.就把aaa的地址给它 假设没有则创建 String a ...

  8. handlebar的一些用法——个人使用总结

    handlebar的一些用法 概述与介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less t ...

  9. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

  10. JBPM——MyEclipse开发环境的搭建

    第一次接触JBPM我不知道如何在工程中的应用.查了一些资料.大约在JBPM随着时代的发展有一定的了解.首先JBPM它是JBoss件平台的一个组成部分.是一个灵活的,易扩展的工作流管理系统,仅仅只是这个 ...