框架设计——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 ...
随机推荐
- ios CoreBluetooth 警告 is being dealloc'ed while pending connection
ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...
- 微信小程序初体验(上)
版权声明:本文由练小习原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/204 来源:腾云阁 https://www.qclo ...
- noip2016赛后总结
面前并不是一颗变质的心. 只是一种综合并适应一切的情怀. 这或许是最好的心态... 今年的noip貌似考得好不理想呢...彻底挂了... gjs580,hgr555. 一个初三学弟570,一个400+ ...
- 为学Linux 我看了这些书
去年开始,抱着学习的态度开始了我的Linux学习,到现在,差不多一年了,收获很多,不敢说精通Linux,但是,还是对得起“略懂”这两个字的.这一年里我看了很多书,细细数下,大概15本左右,其中包含了两 ...
- (30)odoo中的快捷标签
* 快捷标签 提供快捷标签是为了简化代码的编码,把复杂的工作封装化 * 找到封装化的源码: openerp/tools/convert.py xml_import self._ ...
- Uva-------(11462) Age Sort(计数排序)
B Age Sort Input: Standard Input Output: Standard Output You are given the ages (in years) of all ...
- 详细解读Jquery各Ajax函数
$.get(),$.post(),$.ajax(),$.getJSON() 一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表,callba ...
- listview加载性能优化ViewHolder
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局, 但当listview有大量的数据需要加载的时候 ...
- Java集合——Map接口
1.定义 Map用于保存存在映射关系<key,value>的数据.其中,key值不能重复(使用equals()方法比较),value值可以重复 2.方法 V put(key,value) ...
- ArangoDB介绍——未知架构和底层原理
ArangoDB介绍 ArangoDB是一个开源NoSQL数据库,官网:https://www.ArangoDB.org/ArangoDB支持灵活的数据模型,比如文档Document.图Graph以及 ...