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是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。)

  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 List<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
  40. {
  41. return db.Set<T>().Where(whereLambda).AsQueryable();
  42. }
  43.  
  44. public List<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 - ))
  54. .Take(pageSize)
  55. .AsQueryable().ToList();
  56. }
  57. else
  58. {
  59. return
  60. db.Set<T>()
  61. .Where(whereLambda)
  62. .OrderByDescending(orderbyLambda)
  63. .Skip(pageSize * (pageIndex - ))
  64. .Take(pageSize)
  65. .AsQueryable().ToList();
  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. List<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
  8. List<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. List<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
  8.  
  9. List<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 abstract class BaseService<T> where T:class,new ()
  2. {
  3. public IDbSession DbSession
  4. {
  5. get { return DbSessionFactory.GetDbSession(); }
  6. }
  7.  
  8. public IBaseDal<T> CurrentDal;
  9.  
  10. public int Savechanges()
  11. {
  12. return DbSession.SaveChanges();
  13. }
  14.  
  15. //要求所有的业务方法在执行之前必须给当前的CurrentDal 赋值。
  16. public BaseService()
  17. {
  18. SetCurrentDal();
  19. }
  20.  
  21. //纯抽象方法:子类必须重写此方法。
  22. public abstract void SetCurrentDal();
  23.  
  24. public virtual T Add(T entity)
  25. {
  26. return CurrentDal.Add(entity);
  27. }
  28.  
  29. public virtual bool Update(T entity)
  30. {
  31. CurrentDal.Update(entity);
  32.  
  33. return this.Savechanges() > ;
  34. }
  35.  
  36. public virtual bool Delete(T entity)
  37. {
  38. return CurrentDal.Delete(entity);
  39.  
  40. }
  41.  
  42. public virtual int Delete(params int[] ids)
  43. {
  44. return CurrentDal.Delete(ids);
  45.  
  46. }
  47.  
  48. public List<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
  49. {
  50. return CurrentDal.LoadEntities(whereLambda);
  51.  
  52. }
  53.  
  54. public List<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc)
  55. {
  56. return CurrentDal.LoadPageEntities(pageSize, pageIndex, out total, whereLambda, orderbyLambda, isAsc);
  57. }
  58. }

BaseService

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

  1. public partial class UserInfoService:BaseService<UserInfo>,IUserInfoService
  2. {
  3. public override void SetCurrentDal()
  4. {
  5. CurrentDal = DbSession.UserInfoDal;//对父类虚方法进行重写,以对Dal初始化。
  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>){
  15. return Content("注册成功!");
  16. }
  17. else{
  18. return Content("注册失败!");
  19. }
  20. }

 

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

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. 2017-2018-2 20155234『网络对抗技术』Exp6:信息收集与漏洞扫描

    whois查询 whois用来进行域名注册信息查询.以常用的百度为例,输入whois baidu.com可查询到3R注册信息,包括注册人的姓名.组织和城市等信息. 我们可以很清楚地看到baidu的3R ...

  2. 20155306 白皎 0day漏洞——漏洞利用原理之栈溢出利用

    20155306 白皎 0day漏洞--漏洞利用原理之栈溢出利用 一.系统栈的工作原理 1.1内存的用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样的操作系统.什么样 ...

  3. 20155318 《网络攻防》Exp4 恶意代码分析

    20155318 <网络攻防>Exp4 恶意代码分析 基础问题 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什 ...

  4. 关于Trie的一些算法

    最近学习了一下关于Trie的一些姿势,感觉很实用. 终于不用每次看到字符串判重等操作就只想到hash了 关于Trie的定义,来自百度百科 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的 ...

  5. Ubuntu中程序部署时无法加载动态库的解决方法

    Ubuntu下修改环境变量的三种方法 添加环境变量无法解决,可尝试如下操作: sudo vim /etc/ld.so.conf 在ld.so.conf中加入动态库的目录... 然后 sudo ldco ...

  6. Java过滤器与SpringMVC拦截器的差异学习笔记

    学习摘录地址:http://blog.csdn.net/chenleixing/article/details/44573495 今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了 ...

  7. 用Visual Studio2017写C++静态库

    造轮子是一件有趣的事情,VS是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好Orz).这里就展示一下构建一个简单的静态库的正确姿势. ...

  8. 基于.NET Standard的分布式自增ID算法--Snowflake

    概述 本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法.搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier. 那么为何还要引 ...

  9. Js_图片轮换

    本文介绍用javascript制作图片轮换效果,原理很简单,就是设置延时执行一个切换函数,函数里面是先设置下面的缩略图列表的白框样式,再设置上面大图的src属性,在IE中显示很正常,可是在FF中会有变 ...

  10. 【原】python3.7 无法pip安装提示ssl错误解决方案

    问题 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not av ...