首页 > 学院 > 开发设计 > 正文

.NET中 MEF应用于IOC

2019-11-15 02:31:44
字体:
来源:转载
供稿:网友

.NET中 MEF应用于IOC

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优势

  1. 自VS2010 自带:MEF的功能在 System.ComponentModel.Composition.dll 程序集中,直接引用即可使用,不用安装第三方组件
  2. 配置:MEF是不需要使用配置文件或代码对接口与实现进行一一配对的,只需要简单的使用几个Attribute特性,就能自动完成源与目标的配对工作
  3. 自动化:系统初始化时自动遍历程序目录或指定文件夹下的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容器

       //设置MEF依赖注入容器            DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);            MefDependencySolver solver = new MefDependencySolver(catalog);            //MVC依赖注入            DependencyResolver.SetResolver(solver);

源码:http://files.VEVb.com/AntonWang/MEF%E5%BA%94%E7%94%A8%E4%BA%8EIOC.7z


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表