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容器
//設置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
新聞熱點
疑難解答