使用AssemblyCatalog、Assembly.GetExecutingAssembly()获取程序集下的类(MEF)

摘自:http://t.zoukankan.com/gsk99-p-4934389.html

C# 依赖注入 & MEF参考:https://www.cnblogs.com/onegarden/p/10383056.html

MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基于MEF构建的。MEF的目标是简化创建可扩展的应用程序,其核心类是ComposablePart,即具有组合能力的组件,每一个称为ComposablePart(中文可为可组合构件,不过下文一直采用英文来表示,这样比较贴切)的组件可以组合(称为Import)其它组件的功能(其它组件通过声明Export提供功能)并且它也可以通过定义Export将其功能暴露给其它组件。ComposablePart通过组件目录(ComposablePartCatalog)来搜索发现需要的功能,组件目录可以是一个物理文件目录、网络存储等。每一个ComposablePart还具备动态组合的能力,在必要的情况下可以重新组合功能。本文将采用自底向上的思路体验一下MEF的设计思想。

1、无废话MEF

MEF的核心是可组合组件ComposablePart,它由ComposablePartDefintion来描述和创建。每一个可组合组件通过定义ExportDefintion向其它组件提供功能,通过ImportDefinition引用其它组件的功能,通过Metadata来描述组件自身的信息。在创建一个ComposablePart组件后,通过在组件目录(ComposableCatalog)搜索需要的功能实现组件组合。

2、典型的MEF组合过程

(1)创建组件目录(如AssemblyCatalog)

(2)创建组合容器CompositionContainer,组件容器通过组件目录搜索组件的定义

(3)创建一个组件

(4)从组件容器获取其它组件功能的定义,然后执行匹配组合

示例代码如下:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); //创建一个程序集目录,用于从一个程序集获取所有的组件定义   
var container = new CompositionContainer(catalog); //创建一个组合容器   
var composablePart = new MyComponent();   
container.ComposeParts(composablePart); //执行组合,从容器中获取ExportDefinition并创建实例组合在一起   
// composablePart组合完成以供使用 

 

个人实操:

1、定义一个接口IEntityMapper,并标识特性InheritedExport(这里特性标识子类会被导出,后边子类可以不用表示export导出特性)

 2.程序集下的类均继承这个接口

 

 

 

 3、通过AssemblyCatalog拿到程序集下同一特性的类的实例

 

 

 

posted @ 2022-11-11 10:51  LoneRanger_WDY  阅读(303)  评论(0编辑  收藏  举报