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的知识,之前已经分享过三篇,为什么有今天这篇?是因为昨天分享领域服务的 ...
随机推荐
- uboot移植rtc
uboot中可能会有需求提供rtc的支持目的达到uboot启动也能够进行墙上时间的显示和后面推断.大部分rtc支持的一个必要条件就是已经有i2c的支持.由于非常多的rtc是i2c接口控制的.uboot ...
- 微软Azure公有云个人用户是否能支付得起?
个人建立自己的站点是普通"白领"的愿望.由于,我们的大脑分泌的脑汁须要排泄渠道.怎么办呢? 依据微软公有云的公开报价(Pricing),租用单核CPU.0.75GB内存,20GB硬 ...
- HTTP基础(整理)
前一段时间看了有关这个协议的相关文档,对这个协议有了新的理解,这里整理一下. http是应用层面向对象的协议. 它有以下几个特点: 1. 支持客户服务器模式(这是废话,不支持这个模式怎么工作) 2. ...
- 命令行运行java
运行TestLinuxCommand.java 代码 import java.io.BufferedReader; import java.io.BufferedWriter; import ...
- 35:字符串单词倒排 ReverseWords
题目描述:对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成: 2.非构成单词的字符均视为单词间隔符: 3.要求倒排后的单词间隔符以一个空格表示:如果原字符串中相邻单 ...
- freemark2pdf
freemarker+ITextRenderer 生成html转pdf 博客分类: ITextRenderer ITextRenderer 网上已经有比较多的例子 写这个 但是很多都是简单的 dem ...
- Google论文BigTable拜读
这周少打点dota2,争取把这篇论文读懂并呈现出来,和大家一起分享. 先把论文搞懂,然后再看下和论文搭界的知识,比如hbase,Chubby和Paxos算法. Bigtable: A Distribu ...
- Spring Boot: 加密应用配置文件敏感信息
Spring Boot: 加密应用配置文件敏感信息 背景 我们的应用之前使用的是Druid数据库连接池,由于需求我们迁移到HikariCP连接池,druid 数据源加密提供了多种方式: 可以在配置文件 ...
- SQLServer -- 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'T_FLOW'中的标识列指定显式值。
SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NAME(XXX, XXX,..., XXX) SELECT XXX, XXX,..., XX ...
- 目标检测之人头检测(HaarLike Adaboost)---高密度环境下行人检测和统计
实验程序视频 下载 1 问题描述 高密度环境下的行人统计一直没有得到很好的解决,主要原因是对高密度人群中的行人检测和跟踪是一个很难的问题,如下图所示环境,存在的困难包括: 检测方面: 由于人群整体处于 ...