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容器自动完成。
在逻辑层中,使用 Export特性 标记与它匹配的接口;

在Conronl中,使用 Import 来给接口注入实现类的实例

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容器ui
//设置MEF依赖注入容器 DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath); MefDependencySolver solver = new MefDependencySolver(catalog); //MVC依赖注入 DependencyResolver.SetResolver(solver);
源码:http://files.cnblogs.com/AntonWang/MEF%E5%BA%94%E7%94%A8%E4%BA%8EIOC.7zthis