框架设计——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 ...
随机推荐
- 优之星S900平板电脑root方法
优之星S900root方法: 尝试百度一键root安卓的apk版本root失败. 电脑上下载百度一键root的Windows版本,平板设置→开发者选项→允许USB调试√,保持唤醒状态√,安全设置→允许 ...
- 【CodeVS 1004】四子连棋
http://blog.csdn.net/u013598409/article/details/43924465 相比于一年半前,代码的掌控能力强了许多. #include <cstdio> ...
- jq三级全选全不选
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 百度 WebUploader 简单入门示例
首先一定要引入:jquery.js 然后是webuploader的一个 css和还一个js 三个必须引用. <!DOCTYPE html> <html xmlns="htt ...
- 读书笔记3 Socket
Socket被称为网络插座.用于两个网络应用程序之间的通信. 通信地址:URI 通过协议,地址,端口号可以确定网络上的一个程序.地址和端口号组合称之为端点. 通常会有发信人通信地址,收信人通信地址这两 ...
- IDOC创建、发送、接收及程序代码[转]
什么是IDOC,以及IDOC的步骤 创建IDOC: 第一步:WE31 创建IDOC所包含的字段. 第二步:WE30 创建IDOC 把Segment分配给IDOC 第三步:WE81 创 ...
- <<薪资至少10K的一道题,你能拿下吗>>练习
偶尔要写写算法,是我平时用来保持感觉的常用的方法.今天看到园子里一面试题,看了一下感觉也能实现,不过过程确实艰的,自认为自己对算法的感觉还不错.不过这题确实我也用了差不多一下午的时间,基本上把工作时间 ...
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- Axis2 webservice入门--写个简单的webservice
上一篇介绍了webservice开发前的准备.下面开始写webservice.如果不了解axis2请看上一篇,如果是新手:建议一边看一边写代码,自己动手完成这个过程. 一.新建一个web项目 二.新建 ...
- Android统计图表MPAndroidChart.
Android统计图表MPAndroidChart MPAndroidChart是在Android平台上开源的第三方统计图表库,可以绘制样式复杂.丰富的各种统计图表,如一般常见的折线图.饼状图.柱状图 ...