MVC项目搭建笔记----

项目框架采用ASP.NET MVC+Entity Framwork+Spring.Net等技术搭建,采用”Domain Model as View Model“的MVC开发模式,结合了抽象工厂的思想降低了三层之间的耦合,可以使用此套框架进行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类。(CallContext是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。)

 public class EFDbContextFactory
{
public static DbContext GetCurrentDbContext()
{
//线程内的单例:保证线程内实例唯一
DbContext db = (DbContext)CallContext.GetData("DbContext");
if (db == null)
{
db = new Model1Container(); CallContext.SetData("DbContext", db);
}
return db;
}
}

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

 public class BaseDal<T> where T : class , new()
{
private DbContext db
{
get
{
return EFDbContextFactory.GetCurrentDbContext();
}
}
public virtual T Add(T entity)
{
db.Set<T>().Add(entity);
return entity;
} public virtual bool Update(T entity)
{
db.Entry(entity).State = EntityState.Modified;
return true;
} public virtual bool Delete(T entity)
{
db.Entry(entity).State = EntityState.Deleted;
return true; } public virtual int Delete(params int[] ids)
{
foreach (var item in ids)
{
var entity = db.Set<T>().Find(item);//如果实体已经在内存中,那么就直接从内存拿,如果内存中跟踪实体没有,那么才查询数据库。
db.Set<T>().Remove(entity);
}
return ids.Count();
} public List<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
{
return db.Set<T>().Where(whereLambda).AsQueryable();
} public List<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc)
{
total = db.Set<T>().Where(whereLambda).Count();
if (isAsc)
{
return
db.Set<T>()
.Where(whereLambda)
.OrderBy(orderbyLambda)
.Skip(pageSize * (pageIndex - ))
.Take(pageSize)
.AsQueryable().ToList();
}
else
{
return
db.Set<T>()
.Where(whereLambda)
.OrderByDescending(orderbyLambda)
.Skip(pageSize * (pageIndex - ))
.Take(pageSize)
.AsQueryable().ToList();
}
}
}

在DAL层添加Dal类的T4模板(Dal类生成模板,生成各Dal类,包括继承类和接口,未给出,可自行编写)。T4模板生成的Dal类内容模板如下:

 public partial class UserInfoDal : BaseDal<UserInfo>,IUserInfoDal
{ }

在IDAL层添加IDal接口类的T4模板(未给出,自行编写)。T4模板生成的IDal类内容模板如下:

 public partial interface IUserInfoDal :IBaseDal<UserInfo>
{ }

在IDAL层添加IBaseDal接口类,作为IDal的基接口类,子接口只要继承此接口就可以实现crud(增删改查)及分页接口。

 public interface IBaseDal<T>
{
T Add(T entity);
bool Update(T entity);
bool Delete(T entity);
int Delete(params int[] ids);
List<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
List<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc);
}

在IDAL层添加IDbSession接口类(此类作为DbSession类的约束,符合抽象的思想,不直接返回对象本身,而是返回他的接口,这样就不会直接对对象本身造成依赖,只要修改IDbSession)的T4模板(未给出,自行编写)。T4模板生成的IDbSession类内容模板如下:

 public partial interface IDbSession
{
IUserInfoDal UserInfoDal { get; }
int SaveChanges();
}

在DALFactory层添加DbSession类的T4模板(未给出,自行编写)。T4模板生成的DbSession类内容模板如下:

 public partial class DbSession :IDbSession
{ private IUserInfoDal _UserInfoDal;
public IUserInfoDal UserInfoDal {
get {
if (_UserInfoDal == null)
{
_UserInfoDal =new UserInfoDal();
}
return _UserInfoDal;
}
} public int SaveChanges()
{
//这里只需要调用当前线程内部的上下文SaveChange。
DbContext dbContext = EFDbContextFactory.GetCurrentDbContext();
return dbContext.SaveChanges();
}
}

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

 public class DbSessionFactory
{
public static IDbSession GetDbSession()
{
IDbSession dbSession = (IDbSession) CallContext.GetData("DbSession");
if (dbSession == null)
{
dbSession = new DbSession();
CallContext.SetData("DbSession", dbSession);
return dbSession;
}
return dbSession;
}
}

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

 public interface IBaseService<T>
{
T Add(T entity);
bool Update(T entity);
bool Delete(T entity);
int Delete(params int[] ids);
List<T> LoadEntities(Expression<Func<T, bool>> whereLambda); List<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total,
Expression<Func<T, bool>> whereLambda
, Expression<Func<T, S>> orderbyLambda, bool isAsc);
int Savechanges();
}

在IBLL层添加IBLL接口类的T4模板(未给出,自行编写)。T4模板生成的IBLL接口类内容模板如下:

 public  partial interface IUserInfoService :IBaseService<UserInfo>
{ }

在BLL层创建BaseService类(作为所有Service类的基类,封装crud方法)。

 public abstract class BaseService<T> where T:class,new ()
{
public IDbSession DbSession
{
get { return DbSessionFactory.GetDbSession(); }
} public IBaseDal<T> CurrentDal; public int Savechanges()
{
return DbSession.SaveChanges();
} //要求所有的业务方法在执行之前必须给当前的CurrentDal 赋值。
public BaseService()
{
SetCurrentDal();
} //纯抽象方法:子类必须重写此方法。
public abstract void SetCurrentDal(); public virtual T Add(T entity)
{
return CurrentDal.Add(entity);
} public virtual bool Update(T entity)
{
CurrentDal.Update(entity); return this.Savechanges() > ;
} public virtual bool Delete(T entity)
{
return CurrentDal.Delete(entity); } public virtual int Delete(params int[] ids)
{
return CurrentDal.Delete(ids); } public List<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
{
return CurrentDal.LoadEntities(whereLambda); } public List<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc)
{
return CurrentDal.LoadPageEntities(pageSize, pageIndex, out total, whereLambda, orderbyLambda, isAsc);
}
}

BaseService

在BLL层添加Services类的T4模板(未给出,自行编写)。T4模板生成的Service类内容模板如下:

 public partial class UserInfoService:BaseService<UserInfo>,IUserInfoService
{
public override void SetCurrentDal()
{
CurrentDal = DbSession.UserInfoDal;//对父类虚方法进行重写,以对Dal初始化。
}
}

第五步(配置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>节点下添加:

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

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

 <!--Spring配置节点-->
<spring> <context>
<!--选择XML文件的位置,3种方式,1 配置文件 2 定位文件 3 程序集-->
<!--<resource uri="config://spring/objects"/>-->
<!--resource uri="file://ServiceXml.xml"/-->
<!--resource uri="file://Controllers.xml"/-->
<resource uri="assembly://MyOA_BLL/MyOA_BLL/ServiceXml.xml"/>
<resource uri="assembly://MyOA/MyOA/Controllers.xml"/>
<!--<resource uri="assembly://SpringNetTest/SpringNetTest/objects1.xml"/>-->
</context>
<objects xmlns="http://www.springframework.net"> </objects> </spring>
<!--Spring配置节点结束-->

第六步(注入Service对象):

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

 <objects xmlns="http://www.springframework.net">
<object name="UserInfoService" type="MyOA_BLL.UserInfoService, MyOA_BLL" singleton="false"> </object> </objects>

在Controller文件夹下的各Controller类中添加

 public IUserInfoService UserInfoService{get;set;}
IDbSession session = DbSessionFactory.GetDbSession();

用UserInfoService来调用业务逻辑的方法(通过Spring.net注入UserInfoService对象),在操作完成后用session的savechanges方法控制将对实体的操作保存到数据库中。

在UI层添加Controller.xml文件(用于向Controller类注入UserInfoService对象),内容模板为:

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

至此项目基本框架搭建完成!

Controller调用业务逻辑层完整代码示例:

      public ActionResult Test()
{
return View();
} [HttpPost]
public ActionResult Test(string uname,string pwd)
{
UserInfo u =new UserInfo();
u.UserName=uname;
u.Pwd=pwd;
var t = UserInfoService.Add(u);
session.SaveChanges();
if(t.Id>){
return Content("注册成功!");
}
else{
return Content("注册失败!");
}
}

 

本文如果有什么错误或各位大神有什么建议和不同理解,可以回复交流一下,让本文达到抛砖引玉的目的。

ASP.NET MVC项目框架快速搭建实战的更多相关文章

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

    详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...

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

    学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和分享. 首先,得确定需求,木有需求的话,那还搞个毛线呀!嗯……大致思考了一下,终于得出如下需求: 1.能自定义 ...

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

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

  4. 22、ASP.NET MVC入门到精通——搭建项目框架

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 前面的章节,说了ASP.NET MVC项目中常用的一些技术和知识点,更多的是理论上面的东西,接下来,我将通过一个简单的OA项目来应用我们之前 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(10)- VSS源代码管理 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    ( ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...

随机推荐

  1. 20155218《网络对抗》Exp2 后门原理与实践

    20155218<网络对抗>Exp2 后门原理与实践 常用后门工具实践 1.Windows获得Linux Shell: 在Windows下,先使用ipconfig指令查看本机IP,使用nc ...

  2. 20155323刘威良《网络对抗》Exp6 信息搜集与漏洞扫描

    20155323刘威良<网络对抗>Exp6 信息搜集与漏洞扫描 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查 ...

  3. CF 961E Tufurama

    JYZdalao上课讲了这道题,觉得很好可做 其实也是一道理解了就水爆了的题目 把题意抽象化,可以发现题目求的满足 i<j a[i]>=j a[j]>=i 的i,j对数.由于i,j顺 ...

  4. [2016北京集训试题15]cot-[分块]

    Description Solution 如图,假如我们知道了以任何一个点为顶点的135-180度的前缀和和90-180度的前缀和,我们就可以搞出三角形的面积. 差分.add[i][j]和dev[i] ...

  5. vs如何将工程配置,保存到属性表

    上次讲到新建一个opencv工程的配置过程,整个流程下来还是非常麻烦的.每次新建一个工程都要走这个流程的话就要疯了! 现在介绍一种将工程配置,保存到属性表的方法,那么下次新建工程时,只要添加这个属性表 ...

  6. Hadoop开发第2期---虚拟机中搭建Linux

    注:关于如何将hadoop源码导入Eclipse详见http://pan.baidu.com/s/1hq8ArUs 一.Hadoop配置软件(我的电脑是Windows7旗舰--64bit) 1. VM ...

  7. 异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 解决方案

    原来是因为 AssetsMapper.xml 不知道为什么不见了,导致这个异常,在启动项目时的启动任务里调用到了它,然后因为没有这个xml,所以抛出异常 启动信息: C:\extend\Develop ...

  8. JavaScript快速入门-DOM对象

    一.概述 1.什么是 DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允 ...

  9. 关于使用AzureCli登陆提示SSLError的错误解决方案

    如果使用Powershell的azure cli命令登陆Azure时提示sslerror,大致如下的错误: 这个是由于你的网络前有网关造成的ssl验证没法通过. 解决方案: 在powershell中执 ...

  10. 无前趋的顶点优先的拓扑排序方法(JAVA)(转载http://128kj.iteye.com/blog/1706968)

    无前趋的顶点优先的拓扑排序方法 该方法的每一步总是输出当前无前趋(即人度为零)的顶点,其抽象算法可描述为:     NonPreFirstTopSort(G){//优先输出无前趋的顶点       w ...