框架设计——MVC IOC
主要概念:
注:以下概念是自我理解,不是很准确。
- 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的更多相关文章
- 从零开始实现一个简易的Java MVC框架(三)--实现IOC
Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
- 利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC
终于可以 “一次编写,到处发布” 了,泪流满面! 今天凌晨我从一点多开始搞了四个小时到 5:20,终于搞出了个 Emlog 的 MarkDown 插件!欢迎 Emloger 尝试! 本教程示例代码见 ...
- 组件化框架设计之AOP&IOC(四)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从以下两个方面来介绍组件化框架设计: [AOP(面向切 ...
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- Castle框架中的IOC和AOP机制
反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...
- 面向接口可扩展框架之“Mvc扩展框架及DI”
面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
- 前端MVVM框架设计及实现
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的Avalon开始了,我2013年写过一个关于MVC MV ...
随机推荐
- as的Enter_Frame与Timer
As3中的Timer和Event.EnterFrame是有明显的区别的. Evnet.EnterFrame是定时间隔多少时间出发.如果执行时间比间隔时间长,则会间隔执行时间这么久. 举个例子: Fla ...
- Spring表达式语言 之 5.4在Bean定义中使用EL(拾伍)
5.4.1 xml风格的配置 SpEL支持在Bean定义时注入,默认使用"#{SpEL表达式}"表示,其中"#root"根对象默认可以认为是Applicati ...
- WebContentGenerator
用于提供如浏览器缓存控制.是否必须有session开启.支持的请求方法类型(GET.POST等)等,该类主要有如下属性: Set<String> supportedMethods:设置 ...
- [backbone]backbone.js
学习文档: 开始学习 Backbone http://www.ibm.com/developerworks/cn/web/wa-backbonejs/
- [redis] redis 存取键值对常用的三种使用方式 - Jedis、JedisPool、Jedis分布式
|-Jedis 普通方式 |-JedisPool 连接池方式(需要引入pool相关jar) |-Jedis 分布式 (需要引入pool相关jar) 引入jedis2.7.0和commons.pool2 ...
- HTML5自学笔记[ 1 ]新增标签
新增语义化标签 <header></header>: 用于页面或板块头部. <footer></footer>:用于页面底部. <nav>& ...
- JS基础--问题记录
1. {}var a={};{}是一个空的对象,是 new Object();的简写. 2.判断元素是存在 //jQuery 对象中元素的个数.当前匹配的元素个数. size 将返回相同的值. if ...
- vs版本与.net framework 版本对应
vs2002 .net framework 1.0 vs2003 版本号:7.x .net framework 1.1 window server 2003 vs2005 版本号:8.x . ...
- 500 TypeError: Cannot read property 'connect.sid' of undefined
1:在写passport验证测试用例时,发现有几个引用中间件顺序的错误,检查发现,passport验证写的是session,在传错误信息的时候req.flash调用也需要用到session中间件,否则 ...
- 转载:Javascript作用域原理
首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); alert( ...