.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容器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

相關文章
相關標籤/搜索