博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MEF依赖注入实例
阅读量:4631 次
发布时间:2019-06-09

本文共 3366 字,大约阅读时间需要 11 分钟。

什么是MEF

先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。

也有人把MEF解释为“依赖注入”的一种方式,那么什么是“依赖注入”?如果这样解释,感觉越陷越深......根据博主的理解,了解MEF只需要抓住以下几个关键点:

(1)字面意思,可扩展的framework,或者叫可扩展的库。也就是说,使用MEF是为了提高程序的可扩展性。MEF会根据指定的导入导出自动去发现匹配的扩展,不需要进行复杂的程序配置。

(2)在设计层面上来说,为什么要使用MEF?为了“松耦合”!我们知道,程序设计有几个原则,“高内聚,低耦合”就是其中一个。使用MEF可以帮助我们减少内库之间的耦合。

实现MEF的注入工作

第一步:发现部件---这种方式是通过读取当前程序下的dll文件中的部件

第二步:为第一步中获取到的部件创建一个CompositionContainer实例

第三步:实现IDependencyResolver接口

第四步:注册到DependencyResolver

1.在Global.asax文件下的Application_Start方法执行的文件,里面有一个自定义的MefDependencySolver

DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);            MefDependencySolver solver = new MefDependencySolver(catalog);            DependencyResolver.SetResolver(solver);
View Code

2.定义创建了CompositionContainer对象实例,并继承接口IDependencyResolver实现方法,并最终完成注册到DependencyResolver。

1  public class MefDependencySolver : IDependencyResolver 2     { 3         private readonly ComposablePartCatalog _catalog; 4         private const string MefContainerKey = "MefContainerKey"; 5  6         public MefDependencySolver(ComposablePartCatalog catalog) 7         { 8             _catalog = catalog; 9         }10 11         public CompositionContainer Container12         {13             get14             {15                 if (!HttpContext.Current.Items.Contains(MefContainerKey))16                 {17                     HttpContext.Current.Items.Add(MefContainerKey, new CompositionContainer(_catalog));18                 }19                 CompositionContainer container = (CompositionContainer)HttpContext.Current.Items[MefContainerKey];20                 HttpContext.Current.Application["Container"] = container;21                 return container;22             }23         }24 25         #region IDependencyResolver Members26 27         public object GetService(Type serviceType)28         {29             string contractName = AttributedModelServices.GetContractName(serviceType);30             return Container.GetExportedValueOrDefault(contractName);31         }32 33         public IEnumerable GetServices(Type serviceType)34         {35             return Container.GetExportedValues(serviceType.FullName);36         }37 38         #endregion39     }
View Code

3.实现IDependencyResolver接口 [Export]导出, [Import]导入,同时在对应service上添加注入

[Export]    public class BaseController : Controller    {        #region        ///         /// 登录        ///         [Import]        protected ILoginSiteService LoginSiteService { get; set; }        ///         /// 站点        ///         [Import]        protected IWebsiteSiteService WebsiteSiteService { get; set; }        [Import]        protected IWebAreaSiteService WebAreaSiteService { set; get; }}}
View Code
[Export(typeof (IAttachmentSiteService))]    public class AttachmentSiteService : AttachmentService, IAttachmentSiteService    {        [Import]        private IConversionLogService LogService { set; get; }        [Import]        private IContentFileMappingService MappingService { set; get; }}
View Code

4.在controller头上加上  [Export],后面具体调用实现即可

WebSiteModel webSite = WebsiteSiteService.GetWebSiteById(id.Value);
View Code
哈哈,以上就完成了实现,就是这么简单,不过个人不喜欢这个依赖注入,对性能有一定的影响哦
 

转载于:https://www.cnblogs.com/songStar/p/8608238.html

你可能感兴趣的文章
串级调节系统参数整定方法(串级调节器参数整定)
查看>>
Maven下载失败后lastUpdate文件删除
查看>>
CSS响应式:根据分辨率加载不同CSS的几个方法,亲测可用
查看>>
Java核心技术及面试指南 JDBC部分的面试题总结以及答案
查看>>
[转CSDN]android 滑动入门代码...[geoway]
查看>>
DayDream, 移动VR 2.0里程碑: 概述(上篇)
查看>>
数据产品经理工作(总结篇)
查看>>
算法导论 6-2 代码实现 C++
查看>>
Floyd-傻子也能看懂的弗洛伊德算法(转)
查看>>
python3 常见错误(一)
查看>>
php中怎么实现后台执行?
查看>>
jar包读取jar包内部和外部的配置文件,springboot读取外部配置文件的方法
查看>>
敏捷开发方法综述
查看>>
C语言中库函数strstr的实现
查看>>
python-希尔排序
查看>>
Vue中ref的使用要点
查看>>
python 日志
查看>>
Qt 学习之路 2(84):Repeater
查看>>
form表单文件上传
查看>>
购物车组件开发
查看>>