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的知识,之前已经分享过三篇,为什么有今天这篇?是因为昨天分享领域服务的 ...
随机推荐
- UNP学习笔记(第四章 基本TCP套接字编程)
本章讲解编写一个完整的TCP客户/服务器程序所需要的基本套接字函数. socket函数 #include <sys/socket.h> int socket(int family,int ...
- 【Excle数据透视表】如何隐藏数据透视表中行字段的”+/-”按钮
如下图:新建的数据透视表中有存在"+/-"符号,导致数据透视图不太美观,那么怎么处理呢? 解决方案 单击"显示"组中的"+/-"按钮显示或隐 ...
- tomcat启动出现异常 Error filterStart
tomcat启动中出现 Error filterStart异常, 没有任何堆栈信息,如下: SEVERE: Error filterStart Jul 6, 2012 3:39:05 PM org.a ...
- Rom Modified [Galaxy 3 Tested]
1,Virtualbox虚拟机设置-数据空间注意这里不要勾选那个自动挂载,不然后面mount总会提示mount.vbox.. invalid argument. 2,进入ubuntu中,在终端下输入 ...
- Easy UI form表单提交 IE浏览器不执行success ,以及 datagrid 展示过慢
最近在做一个Easy ui的项目 发现了一些问题,在这里总结下 1.表单提交,后端代码 public ActionResult Save(Request model) { ResultInfo _in ...
- Fragment小结
Fragment是Android3.0之后增加的新特性,通常人们叫它碎片.可是,我认为把它理解成一个View模块比較好,尽管它不是继承自View.假设阅读过源代码就知道它是内置View对象从而实现Vi ...
- 渐变背景(background)效果
chrom and Safari浏览器: webkit核心的浏览器.使用CSS3渐变方法(css-gradient) -webkit-gradient(type, start_point, end_p ...
- python学习(七)字典学习
#!/usr/bin/python # 字典 # 当时学java的时候, 语言基础就学了好久, 然后是各种API, 最后才是集合 # 键值对, 可变 # 1. 映射操作 D = {'food' : ' ...
- IPv4(三)地址掩码
回顾网络类型确定 回顾一下之前学过的如果确定IP地址网络号,这里先不考虑子网. 首先通过首个八位组字节规则很容易确定IP地址属于那个网络: 如果第1位是0,则是A类地址: 如果前两位是10,则是B类地 ...
- 已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。 从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。
// ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...