首页 > 编程语言 >使用AssemblyCatalog、Assembly.GetExecutingAssembly()获取程序集下的类(MEF)

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

时间:2022-11-11 11:02:17浏览次数:54  
标签:MEF Assembly 组合 ComposablePart 创建 组件 AssemblyCatalog

摘自:http://t.zoukankan.com/gsk99-p-4934389.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

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

 

 

 

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

 

 

 

标签:MEF,Assembly,组合,ComposablePart,创建,组件,AssemblyCatalog
From: https://www.cnblogs.com/wangdongying/p/16879858.html

相关文章

  • 004 Web Assembly康威游戏之优化
    0介绍视频地址:https://www.bilibili.com/video/BV1eg411g7c8相关源码:https://github.com/anonymousGiga/Rust-and-Web-Assembly1说明在上一节的实现中,我们是在Rust中实现......
  • 110-注解JSONField、DateTimeFormat、JsonFormat、JsonProperty
    JSONField注解在属性上,作用为:属性的名称与转为toString的名称不一样时,使用该注解。例如:@JSONField(name="user_id")privateStringuserId;当userId="a";使用:JSON.......
  • 再次认识 WebAssembly
    WebAssembly(Wasm)是基于堆栈的虚拟机的二进制指令格式,一种低级汇编语言,旨在非常接近已编译的机器代码,并且非常接近本机性能。前面在文章《​​​​快速认识WebAssembly​​......
  • dremio HomeFileSystemStoragePlugin简单介绍
    使用过dremio的同学应该了解dremio对于每个用户会支持一个@的导航(小房子标记)参考接口效果restapi请求的,会包含一个containerTypehome的就是HomeFileSystemStorage......
  • WebAssembly 技术
    WebAssembly有一套完整的语义,实际上wasm是体积小且加载快的二进制格式,其目标就是充分发挥硬件能力以达到原生执行效率。WebAssembly是一种可以使用非JavaScript编程语言......
  • WebAssembly01-- 在js中分配内存
    编译选项emccsum.cc-osum.js-sEXPORTED_FUNCTIONS=_malloc,_freesum.cc#include"util.h"#include<stdlib.h>#include<string.h>#include<malloc.h>EM_PORT_AP......
  • WebAssembly01--web 编译FFmpeg(WebAssembly版)库
    下载ffmpeg版本注意这里是承接dockerUbuntuwasm环境配置浏览器debugc/c++gitclonehttps://git.ffmpeg.org/ffmpeg.gitffmpegcdffmpeggitbranch-rgitc......
  • WebAssembly01--在JavaScript中读写C/C++内存
    编译选项emccmem.cc-omem.jsmem.cc#include"util.h"intg_int=42;doubleg_double=3.1415926;EM_PORT_API(int*)get_int_ptr(){return&g_int;}EM_PO......
  • WebAssembly01--util.h
    内容简要请使用者自行优化#ifndefEM_PORT_API# ifdefined(__EMSCRIPTEN__)# include<emscripten.h># ifdefined(__cplusplus)# defineEM_PORT_API(rettype)......
  • WebAssembly01--c代码调用js
    编译选项emcctest.c--js-librarypkg.js-otest.jspkg.jsmergeInto(LibraryManager.library,{js_add:function(a,b){console.log("js_add");......