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         }
时间: 2024-10-24 09:28:43

ASP.NET MVC企业级项目框架搭建实战的相关文章

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

学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对项目的代码始终停留在一知半解的地步,能改一些简单的bug,但关于项目的来龙去脉始终云里雾里.对于asp.net mvc的架构始终看不懂.因此,照着传智博客的学习视频,学了一下简单的架构搭建.真个架构的搭建我看了将近两遍视频,才稍稍有些头绪,今天在这里记录一下,一方面加深理解,一方面如果以后忘记了,还

ASP.NET MVC EF 01 框架搭建

1.自动属性 (1)自动属性(Auto-Implemented Properties),C#自动属性可以避免原来我们手工的来声明一个私有成员变量以及和属性get,set的书写. public class Kencery  //声明一个Kencery的类 { public int ID{get;set;}  //主键ID public string Name{get;private set;}  //只读属性名字 public int Age{get;set;}   //年龄 } 2.隐式类型va

使用ASP.NET MVC+Entity Framework快速搭建博客系统

学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和分享. 首先,得确定需求,木有需求的话,那还搞个毛线呀!嗯--大致思考了一下,终于得出如下需求: 1.能自定义分类 2.能发文章 OK!就这样,先从简单的开始(其实是复杂的不会做),后面有需要再添加(希望水平能达到).功能确定了,那么改确定要做成什么样子的了.先和度娘商量一下先-- 终于在我的淫威之下,度娘交出了一个比较简洁的,源网站在这里(表示感谢),被小弟阉割了之后效果如下图: 接下来就开始编码了么?嗯

使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错误出现,心中一万只草泥马奔腾而来,这也叫支持吗,这个问题是Visual Studio造成的,不相信的话可以使用Xamarin.Studio创建的asp.net项目,部署过程非常顺利,没有遇到什么问题:本文就是为你解开这个结,如何Visual Studio 2015搞定ASP.NET MVC 5项目的

图文详解远程部署ASP.NET MVC 5项目

原文:图文详解远程部署ASP.NET MVC 5项目 话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署.因此今天专门研究了一下具体的过程,下面和大家分享一下.本人新手,还望大虾勿喷,有什么问题,还望高手指点. 一.本文实验环境: Windows Server 2012 R2 SQL Server 2012 Express Visual Studio 2013 项目为:ASP.NET MVC 5.0,使用的是L

1、Android项目框架搭建 (分析需求、整理资料)

闲来无事.想搭个框架试试 分析一般应用 将资料整理整理 粗略统计 需要以下资料 1.android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal )ScrollView.Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多.并且他实现的下拉刷新ListView在item不足一屏情况下也

(三) Angular2项目框架搭建心得

前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2.*版本的面目全非,不过宽容点来看这个强大的框架,升级到ng2肯定是一件好事情,虽然截至目前ng2还存在或多或少需要完善的地方,但是ng2做到了留下并强化ng1好的部分,移除或改善其不好的部分,并且基于许多较新Web技术来开发,不去看从ng1迁移到ng2的门槛和工作量的话,ng2的编程体验是很酷炫的. 目前n

[AngularJS]项目框架搭建-MyFirst Skeleton

前文有提到过 做一个简单的订餐系统,最近花了点时间,了解了一下AngularJS框架的使用.因此本文的目的根据了解的知识重新搭建基于 AngularJS框架. 该框架是基于对于AngularJS的学习而制定的,这其中肯定有很多不足,在以后的学习中在加以改进. 一.系统准备 安装Node.js version>=0.10.0版本 Git  Shell 并添加该 Shell脚本到Path环境变量中  Path=:,"$git_home/bin"   二.手动搭建框架 2.1 创建开发

利用Powershell自动部署asp.net mvc网站项目 (一)

这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交道,部署过程中协作的组建太多,相互之间的交集不可能太大.可能唯一能够通用的是自动化部署的基本原则(只是这篇文章的基本原则): 每一次自动化部署结束之后,应用程序都会有相同的初始状态. 自动化部署的机器非常干净,只有相应的 Windows Server 系统和 .NET Framework.尤其是,不