主要概念:

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

  • 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. Working with Data » 使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

    原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web applica ...

  2. hdu 1710 二叉树的遍历

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1710 大意:给出一个二叉树的前序和中序,求其后序遍历 ps:1.在写链表时,需要写明typedef str ...

  3. 第二周 WBS、NABCD查阅

    WBS WBS:工作分解结构(Work Breakdown Structure) 创建WBS:创建WBS是把项目可交付成果和项目工作分解成较小的,更易于管理的组成部分的过程. WBS是项目管理重要的专 ...

  4. linux查看是否已安装GCC及安装GCC

    输入:gcc -v;如果提示未找到命令即表示没有安装 使用:yum install gcc即可

  5. form程序的界面修改

    做主题视频库的界面的修改工作,是b/s端的窗口,是由form窗口生成,如下截图: 主要有三个方面,1.左侧菜单栏宽度固定,不随整个窗口大变化而变化.2.导出excel按钮的位置的移动,不管整个窗口是变 ...

  6. 让Windows下的Tomcat将控制台信息记录到日志

    在开发的过程中经常出现包冲突,却不知道怎么回事,可以在 catalina.bat 里面设置查看class加载日志   set CATALINA_OPTS=-server -Xdebug -Xnoage ...

  7. C#学习笔记思维导图 一本书22张图

    阅读的书是<21天学通C#>博客中有下载 看看总结之后的模块 全部文件 初步展示 数据存储 继承模块 暂时就这些吧 全部思维导图22张打包下载

  8. 关于linux服务器的批量维护、批量升级、

    由于版权费用原因,众多中小服务器采用linux服务器进行功能处理.在进行批量升级.更新业务程序时.可以采用如下批量方案: 1.打包成rpm包,并配置yum源服务器,以支持个人的yum服务器进行处理.一 ...

  9. linux :TOP命令及参数解析

    第二行 分别显示:total进程总数. running正在运行的进程数. sleeping睡眠的进程数.stopped停止的进程数. zombie僵尸进程数. 第三行 分别显示: %us 用户空间占用 ...

  10. 使用MediaPlayer播放音频-----之二

    MediaPlayer播放不同来源的音频文件: 一.播放应用的资源文件 1.调用MediaPlayer的create(Context  context , int  resid)方法加载指定资源文件. ...