主要概念:

注:以下概念是自我理解,不是很准确。

  • IOC:Inversion of Control(控制反转)。

本来对象创建是通过使用类内部进行创建,现在把对象创建交给container(容器)管理

打个比方好比现在华数网络(container),你去华数网络营业厅注册服务(普通电视,高清电视,华数网络),等你回家你接上电视,华数网络(container)就可以将普通电视或高清电视的对象返回给你;当你接上电脑时,华数网络(container)就将华数网络对象返回给你。

  • Unity

Unity是微软的一款轻量级的容器。

namespace MVCIOC.IOC
{
public class HttpContainerBuilder
{
public static readonly IUnityContainer UnityContainer = new UnityContainer(); public static void Register()
{
//注册Service1和Service2
UnityContainer.RegisterType(typeof (Service1));
UnityContainer.RegisterType(typeof (Service2));
//注册Control
UnityContainer.RegisterType(typeof (HomeController));
}
}
}

这个往UnityContainer中注册了两个Servie1和Service2两种类型,并注册了HomeController

namespace MVCIOC.IOC
{
public class UnityDependencyResolver : IDependencyResolver
{
IUnityContainer container;
public UnityDependencyResolver(IUnityContainer UnityContainer)
{
this.container = UnityContainer;
} public object GetService(Type serviceType)
{
return container.Resolve(serviceType);
} public IEnumerable<object> GetServices(Type serviceType)
{
return container.ResolveAll(serviceType);
}
}
}

IDependencyResolver是依赖解析器接口

protected void Application_Start()
{
HttpContainerBuilder.Register();
DependencyResolver.SetResolver(new UnityDependencyResolver(HttpContainerBuilder.UnityContainer)); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

注册类型,并设置依赖解析器(实现IDependencyResover接口的对象),这样UnityDependencyResolver接管了部分依赖注入类

这样理论上里说,Sevice1,Service2,HomeControl类创建类型由Container容器来创建,感觉IOC与MVC已经完美结合了,但是运行以后就碰到了阻力。

缺少一个IControllerFactory类,缺少类型映射。

正如dudu所说我们总不能MVC中的所有接口都要注册一下,所以我们需要知道什么时候接受创建Controller,当Contorller所有准备都完成后,我们才接受创建Controller

   public class UnityControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return (IController)HttpContainerBuilder.UnityContainer.Resolve(controllerType);
} }

这样我们在获取Controller时才从容器中解析对象,但是我们如果将那些没有在容器中注册过的类,实例化交给MVC自己实例

     public object GetService(Type serviceType)
{
if (container.IsRegistered(serviceType))
{
return container.Resolve(serviceType);
}
return null;
}

当依赖解析器发现此类型没有注册过,就返回null,这样此类型的实例还有默认实例方式进行实例。

综上就可以将IOC与MVC完美结合了,总结如下:

1.UnityContainner      通过方法RegisterType(Type)  注册类型

2.UnityDependecyResolver:IDenpendecySolve

    定义依赖解析的方式,可以指定给MVC

3.DependencyResolver.setResolver(第二点对象)    设置MVC依赖解析器

4.GetService(Type type)

获取解析对象,判断类型是否已注册  containner.IsRegistered(Type type),若没有注册,就返回null,还是采用默认获取对象方式

5.UnityControllerFactory:DefaultControllerFactory

重写GetControllerInstance(),将其从容器中获取对象

如何保证容器中在一次Http请求中保证只有一个对象,所以要LifetimeManager(生命周期策略)

这个下次再讲。

  • Autofac(推荐)

Autofac在使用中发现,他比Unity更贴切MVC

下载地址:http://code.google.com/p/autofac/downloads/list

Autofac.dll  基础包

Autofac.Integration.Mvc.dll  MVC包

 //注册数据库访问对象
ContainerBuilder.RegisterType(contextType).InstancePerHttpRequest();
//注册Service对象
ContainerBuilder.RegisterAssemblyTypes(serviceAssembly).InstancePerHttpRequest();
//注册仓储类
ContainerBuilder.RegisterAssemblyTypes(repositoryAssembly).InstancePerHttpRequest(); //注册Mvc控制器
ContainerBuilder.RegisterControllers(webAssembly).InstancePerHttpRequest();
//注册Mvc模型绑定管道
ContainerBuilder.RegisterModelBinderProvider();
//注册Mvc模型绑定器
ContainerBuilder.RegisterModelBinders(); Container = ContainerBuilder.Build();
//Contoler的MVC解析点通过Container
DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));

InstancePerHttpRequest:保证了生命周期策略,每次Http请求只实例化一次

RegisterControllers:提供了单独注册Controller的方法

框架设计——MVC IOC的更多相关文章

  1. 从零开始实现一个简易的Java MVC框架(三)--实现IOC

    Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency ...

  2. 产品前端重构(TypeScript、MVC框架设计)

    最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...

  3. 利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC

    终于可以 “一次编写,到处发布” 了,泪流满面! 今天凌晨我从一点多开始搞了四个小时到 5:20,终于搞出了个 Emlog 的 MarkDown 插件!欢迎 Emloger 尝试! 本教程示例代码见  ...

  4. 组件化框架设计之AOP&IOC(四)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从以下两个方面来介绍组件化框架设计: [AOP(面向切 ...

  5. Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

    标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...

  6. Castle框架中的IOC和AOP机制

    反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...

  7. 面向接口可扩展框架之“Mvc扩展框架及DI”

    面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...

  8. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  9. 前端MVVM框架设计及实现

    最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的Avalon开始了,我2013年写过一个关于MVC MV ...

随机推荐

  1. 能源项目xml文件标签释义--DataSource

    <bean id="dataSource1" class="org.apache.tomcat.jdbc.pool.DataSource" destroy ...

  2. Web网页性能管理详解

    你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的 CPU 和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个 ...

  3. 杭JS

    杭JS的视频终于出来了.看了Garry Yao的视频依旧看不懂...总体上感觉是在职场上,我不在孤单了,勇敢的前进吧! 玉伯: 视频看了很多,什么情绪管理实践管理,最值得学习的就是知识管理定律了,找到 ...

  4. 呆呆的io流输入输出的一些基础

    关于io流的File类,下面来码一些基础属性: 文件的属性: /* public String getName() 获取文件的名字 public boolean canRead() 判断文件是否可以读 ...

  5. 张艾迪(创始人):出现在世界224C之前的这些时间

    出现在世界224C之前的这些时间 坐在大巴车上.用手塞住耳朵.繁杂的大巴车上.总会听见不喜欢听的声音.那时只有22.23岁的我.就像发明一些东西把所有不喜欢的声音都屏蔽掉.就像防火墙一样.那时候拥抱所 ...

  6. iOS 10 消息推送(UserNotifications)秘籍总结(一)

    前言 之前说会单独整理消息通知的内容,但是因为工(就)作(是)的(很)事(懒)没有更新文章,违背了自己的学习的初衷.因为互联网一定要有危机意识,说不定眼一睁,我们就out丢了饭碗. 图片来源网络.jp ...

  7. java.util 类 TreeSet<E>

    java.lang.Object≥ java.util.AbstractCollection<E> ≥ java.util.AbstractSet<E> ≥ java.util ...

  8. 企业级的响应式设计(Responsive design at enterprise level)译

    导言 响应式设计是现在人们谈论的热点,但如何部署,特别是在有多种设备的大型项目中如何组织响应式设计,响应式设计和可伸缩性(Scalable)有什么区别?这都是需要解决的难题. 优化用户经验——Opti ...

  9. [转]使用Java Mission Control进行内存分配分析

    jdk7u40自带了一个非常好用的工具,就是Java Mission Control.JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRoc ...

  10. Excel中连接函数CONCATENATE()

    直接API: CONCATENATE 函数语法具有下列参数 (参数:为操作.事件.方法.属性.函数或过程提供信息的值.): Text1 必需. 要连接的第一个文本项. Text2, ... 可选. 其 ...