IOC解释
IOC,控制反转的意思。
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓反转,你必须理解如果不反转,会怎么着,因为A必须要有B,才可以调用B,如果不反转,意思就是A主动获取B的实例:B b = new B(),这是获取获取B实例的方法,然后你就可以调用b对象了。
所以,不反转,意味着A要主动获取B,才能使用B;到了这里,你就应该明白了反转的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。
.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,StructureMap,Spring.Net等,这些第三方工具各不相同,但功能大体都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动或手动来通过接口来获得相应实现类的实例,对象实例化的工作由IOC容器自动完成。
MEF优势
- 自VS2010 自带:MEF的功能在 System.ComponentModel.Composition.dll 程序集中,直接引用即可使用,不用安装第三方组件
- 配置:MEF是不需要使用配置文件或代码对接口与实现进行一一配对的,只需要简单的使用几个Attribute特性,就能自动完成源与目标的配对工作
- 自动化:系统初始化时自动遍历程序目录或指定文件夹下的dll,根据程序集中接口与类的特定Attribute特性进行自动配对。
在逻辑层中,使用 Export特性 标记与它匹配的接口;
在Conronl中,使用 Import 来给接口注入实现类的实例
IOC组件注册
1.MefDependencySolver实现代码如下:
/// <summary> /// MEF依赖关系解析类 /// </summary> public class MefDependencySolver : System.Web.Mvc.IDependencyResolver, System.Web.Http.Dependencies.IDependencyResolver { private readonly ComposablePartCatalog _catalog; private const string MefContainerKey = "MefContainerKey"; public MefDependencySolver(ComposablePartCatalog catalog) { _catalog = catalog; } public IDependencyScope BeginScope() { return this; } public void Dispose() { } public CompositionContainer Container { get { if (!HttpContext.Current.Items.Contains(MefContainerKey)) { HttpContext.Current.Items.Add(MefContainerKey, new CompositionContainer(_catalog)); } CompositionContainer container = (CompositionContainer)HttpContext.Current.Items[MefContainerKey]; HttpContext.Current.Application["Container"] = container; return container; } } #region IDependencyResolver Members public object GetService(Type serviceType) { string contractName = AttributedModelServices.GetContractName(serviceType); return Container.GetExportedValueOrDefault<object>(contractName); } public IEnumerable<object> GetServices(Type serviceType) { return Container.GetExportedValues<object>(serviceType.FullName); } #endregion }
2.Global中初始化MEF容器
1
2
3
4
5
|
//设置MEF依赖注入容器 DirectoryCatalog catalog = new
DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);
MefDependencySolver solver = new
<span style= "font-size: 14px; text-decoration: underline;" ><strong>MefDependencySolver</strong></span>(catalog);
//MVC依赖注入
DependencyResolver.SetResolver(solver);<span style= "line-height: 1.5; font-size: 14px;" ><a style= "line-height: 1.5; font-size: 2em;"
title= "http://yunpan.cn/Q4QyvHMHtf3MW"
href= "http://www.cnblogs.com/AntonWang/admin/IOC组件注册" > </a></span>
|