IoC~MVC3+EF+Autofac实现松耦合的系统架构
MVC3+EF+Autofac网上这种文章确实没有,呵呵,今天就写一个,代大家分享!
这个系列的文章将带我们进入一种新的开发模式,注入开发模式,或者叫它IOC模式,说起IOC你可以这样去理解它,它为你的某个实现流出一个注入点,你生产的对象,可以根据你之前的配置进行组合,这是可以的。而注入点的位置及方式也是多种多样的,我们今天主要说一个通过HTTP请求进行注入的方式,IOC工具使用高效的
Autofac,对它的认识你可以看这篇文章。
首先看一下我们这个项目的知识点:
MVC3~一个对UI层进行分层的架构模式,在微软的MVC3中加入了开源的Razor引擎
EF~这无疑是微软自己比较成功的ORM工具,它执行效率上要高于linq to sql,甚至你自己编写的ado.net脚本。
Autofac~这是在orchard项目中被广泛的IoC工具,它支持类型,反泛,HTTP等注入
对于这个系统的autofac部分,我们将它的注入点放在controller的构造函数中,将生产的对象配置在global中,当然,你也可以设置在config文件,或者你自己的XML文件。
我认为它的工作方式应该是:
网站启动=>从global中得到ioc配置信息=>http request请求页面=>通过controller中的参数进行实现的创建=>action中使用创建好的对象
OK,有了这样一个理论基础,我们来看一下代码吧:
EF部分的DATA层
1 /// <summary>
2 /// EF数据结构实现
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class Repository<T> : IRepository<T> where T : class
6 {
7 private readonly DbContext _db;
8
9 public Repository()
10 {
11 Logger = NullLogger.Instance;
12 _db = new EEE114Entities();
13 }
14
15 public ILogger Logger { get; set; }
16 #region IRepository<T> 成员
17 List<string> _columns;
18 public Repository<T> AddColumn(Func<string> func)
19 {
20 _columns.Add(func());
21 return this;
22 }
23 #region Create,Update,Delete
24 public virtual void Create(T entity)
25 {
26 Logger.Debug("Create {0}", entity);
27 _db.Entry<T>(entity);
28 _db.Set<T>().Add(entity);
29 }
30
31 public virtual void Update(T entity)
32 {
33 Logger.Debug("Update {0}", entity);
34 _db.Set<T>().Attach(entity);
35 var ObjectStateEntry = ((IObjectContextAdapter)_db).ObjectContext.ObjectStateManager.GetObjectStateEntry(entity);
36 string[] p = { };
37 Array.ForEach(p, x =>
38 {
39 ObjectStateEntry.SetModifiedProperty(x.Trim());
40 });
41 }
42
43 public virtual void Delete(T entity)
44 {
45 Logger.Debug("Delete {0}", entity);
46 _db.Set<T>().Attach(entity);
47 _db.Set<T>().Remove(entity);
48 }
49
50 public virtual void SaveChanges()
51 {
52 try
53 {
54 _db.SaveChanges();
55 }
56 catch (System.Data.Entity.Infrastructure.DbUpdateException ex)
57 {
58 string Message = "error:";
59 if (ex.InnerException == null)
60 Message += ex.Message + ",";
61 else if (ex.InnerException.InnerException == null)
62 Message += ex.InnerException.Message + ",";
63 else if (ex.InnerException.InnerException.InnerException == null)
64 Message += ex.InnerException.InnerException.Message + ",";
65 throw new Exception(Message);
66 }
67 }
68 #endregion
69
70 #region Get
71 public virtual int Count(Expression<Func<T, bool>> predicate)
72 {
73 return Fetch(predicate).Count();
74 }
75 public T Get(params object[] id)
76 {
77 throw new NotImplementedException();
78 }
79 public virtual T Get(Expression<Func<T, bool>> predicate)
80 {
81 return Fetch(predicate).SingleOrDefault();
82 }
83 public IQueryable<T> Table
84 {
85 get { return _db.Set<T>(); }
86 }
87
88 public IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate)
89 {
90 return Table.Where(predicate);
91 }
92
93 public IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order)
94 {
95 var orderable = new Orderable<T>(Fetch(predicate).AsQueryable());
96 order(orderable);
97 return orderable.Queryable;
98 }
99
100 public IEnumerable<T> Fetch(Expression<Func<T, bool>> predicate, Action<Orderable<T>> order, int skip, int count)
101 {
102 return Fetch(predicate, order).Skip(skip).Take(count);
103 }
104 #endregion
105
106 #endregion
107 }
Services层(BLL层)核心代码:
1 /// <summary>
2 /// 网站异常业务
3 /// </summary>
4 public class Web_ExceptionLogManager : IWeb_ExceptionLogManager
5 {
6 IRepository<Web_ExceptionLog> _web_ExceptionLogRepository;
7 public Web_ExceptionLogManager(IRepository<Web_ExceptionLog> web_ExceptionLogRepository)
8 {
9 _web_ExceptionLogRepository = web_ExceptionLogRepository;
10 }
11 #region IWeb_ExceptionLogManager 成员
12
13 public List<Web_ExceptionLog> GetWeb_ExceptionLog()
14 {
15 return _web_ExceptionLogRepository.Fetch(i => i.FullInfo != null, i => i.Asc(j => j.OccurTime)).ToList();
16
17 }
18
19 #endregion
20 }
WEB层MVC部分代码:
1 public class HomeController : Controller
2 {
3 IRepository<Web_Logs> _iRepository;
4 IWeb_ExceptionLogManager _web_ExceptionLogManager;
5
6 public HomeController(IRepository<Web_Logs> iRepository, IWeb_ExceptionLogManager web_ExceptionLogManager)
7 {
8 _iRepository = iRepository;
9 _web_ExceptionLogManager = web_ExceptionLogManager;
10 }
11
12 public ActionResult Index(int sort = 1)
13 {
14 ViewBag.Message = "欢迎使用 ASP.NET MVC!";
15
16 var model = _iRepository.Fetch(i => i.Info != null, i => i.Asc(j => j.OccurTime));
17 if (sort != 1)
18 model = _iRepository.Fetch(i => i.Info != null, i => i.Desc(j => j.OccurTime));
19
20 ViewBag.Log = _web_ExceptionLogManager.GetWeb_ExceptionLog();
21 return View(model);
22 }
而注入参数我们放在global中,看一下核心代码:
1 protected void Application_Start()
2 {
3 #region Autofac注入
4 var builder = new ContainerBuilder();
5 builder.RegisterControllers(Assembly.GetExecutingAssembly());
6 builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
7
8 builder.RegisterType<Web_ExceptionLogManager>().As<IWeb_ExceptionLogManager>().InstancePerHttpRequest(); //从HTTP请求中重到注入点
9
10 IContainer container = builder.Build();
11 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
12 #endregion
13
14 AreaRegistration.RegisterAllAreas();
15 RegisterGlobalFilters(GlobalFilters.Filters);
16 RegisterRoutes(RouteTable.Routes);
17 }
OK,我们运行后,在/Home/Index中自己运行HTTP请求把global中的对象进行创建,当然,它在创建对象时,你可以是DATA层,或者是SERVICE层的,这里
没有考虑WEB不能与DATA通讯问题,实际项目中,我们的WEB层不应该有对DATA层的引用,所以,WEB层一般只注入SERVICE的对象,这一点是需要注意的。
IoC~MVC3+EF+Autofac实现松耦合的系统架构的更多相关文章
- [转]ASP.NET MVC3 + EF 性能优化解决方案以及最优架构
[集思广议] 我们用 asp.net mvc3 + ef 做了一个网站,现在是内测阶段,发现打开速度非常慢.首页打开(无缓存)都在5-6s以上(测试环境:程序和db都在本机),请问各位 mv ...
- ActiveMQ 翻译第一章 1.2小节(松耦合与ActiveMQ和何时使用ActiveMQ)
第一章 1.2.1小节 松耦合与ActiveMQ ActiveMQ为应用程序架构提供送耦合实现组件.松耦合经常被引入到系统架构中,来减轻紧耦合的远程工程调用的使用.松耦合的设计是异步的,来自其他系统 ...
- Spring松耦合示例(转)& IOC
Spring松耦合示例 轻松学习Spring<一> IoC容器和Dependency Injection模式 最近公司需要,项目中要用到Spring和Ibatis.趁着过年好好学习学习.I ...
- IoC实践--用Autofac实现MVC5.0的IoC控制反转方法
Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...
- 基于Mvc3,Ef,领域驱动电子商务系统的EShop开发
分享自己从代码小工一步步走向搭架子,ING... 简单了解UnitOfWork 摘要: UnitOfWorkUnit Of Work模式,即工作单元,它是一种数据访问模式.它是用来维护一个由已经被业务 ...
- 多层架构+MVC+EF+AUTOFAC+AUTOMAPPER
最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友. 一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证 ...
- IOC容器之Autofac
讲到IOC容器,就必须提到DIP(依赖倒置原则). DIP是OOD(面向对象设计)的一个重要思想,在该原则上引申出了\IOC(控制反转)\DI(依赖注入)\IOC容器. 居然讲到IOC容器,当然我们要 ...
- C#进阶系列——MEF实现设计上的“松耦合”(二)
前言:前篇 C#进阶系列——MEF实现设计上的“松耦合”(一) 介绍了下MEF的基础用法,让我们对MEF有了一个抽象的认识.当然MEF的用法可能不限于此,比如MEF的目录服务.目录筛选.重组部件等高级 ...
- C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
前言:今天十一长假的第一天,本因出去走走,奈何博主最大的乐趣是假期坐在电脑前看各处堵车,顺便写写博客,有点收获也是好的.关于MEF的知识,之前已经分享过三篇,为什么有今天这篇?是因为昨天分享领域服务的 ...
随机推荐
- Vue 内容分发slot
1.概述 内容分发:混合父组件的内容与子组件自己的模板. 2.单个插槽 当子组件模板只有一个没有属性的插槽时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身. 最初在 ...
- bootcamp安装win7的详细步骤 (光盘安装)
bootcamp安装win7的详细步骤 首先是要您确定以下内容(1)您的Mac系统下是一个盘符,也就是“macintosh hd”一个磁盘.如果不是的话,首先您需要做的是备份您分区下面的资料,让磁 ...
- SAS学习经验总结分享:篇四—SQL过程
SQL过程 SQL过程是实现对数据集或关系数据库的表进行操作的过程,对数据集或关系数据库的表进行查询.修改.创建表.删除数据.插入数据和更新数据等功能.提现了SAS对大型数据库管理系统通用的SQL语言 ...
- Session对象失效的客户端解决方法
ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息.当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问 ...
- C语言 结构体作为函数的参数
1)使用结构体变量作为函数的参数 使用结构体变量作为函数的实参时,采用的是值传递,会将结构体变量所占内存单元的内容全部顺序传递给形参,形参必须是同类型的结构体变量 demo: # include &l ...
- spring中的异步事件
这里讲解一下Spring对异步事件机制的支持,实现方式有两种: 1.全局异步 即只要是触发事件都是以异步执行,具体配置(spring-config-register.xml)如下: Java代码 ...
- 用C语言解决迷宫问题
#include <stdio.h> #include <stdlib.h> #define ROW 10 #define COL 10 /*迷宫中位置信息*/ typedef ...
- JavaScript 作用域链图具体解释
<script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao94 ...
- MVC总结--MVC简单介绍以及和WebForm差别
什么是MVC MVC(Model-View-Controller.模型-视图-控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Cont ...
- cocos2d-x-3.1 国际化strings.xml解决乱码问题 (coco2d-x 学习笔记四)
今天写程序的时候发现输出文字乱码,尽管在实际开发中把字符串写在代码里是不好的做法.可是有时候也是为了方便,遇到此问题第一时间在脑子里面联想到android下的strings.xml来做国际化.本文就仅 ...