使用另一个MEF程序集中的类而不引用该程序集

本文关键字:程序集 引用 集中 另一个 MEF 程序 | 更新日期: 2023-09-27 17:58:56

我有两个MEF组件。让它是成分A和成分B。

我需要的是能够从组件a中的组件B访问一个类,而不必引用它。然后我想手动实例化该类的对象。

目前我看到MEF允许使用[Import]自动实例化对象。它使用需要参考的接口。

我可以使用其他程序集的数据类型而不引用它吗?MEF是否支持这种机制?

使用另一个MEF程序集中的类而不引用该程序集

您可以通过反射实例化类,而无需对文件进行硬引用。你不需要MEF。

有几种方法可以做到这一点。

首先,您需要定义一个两个程序集都能理解的通用接口。这可能是这两个程序集都引用的"PublicInterfaces"库,也可能在程序集a内部(B引用a,但不是相反)。

在B中,使用此接口导出类型。

B必须在容器的目录中。要么在AssemblyCatalog中显式引用程序集B,要么创建DirectoryCatalog并将其指向将包含程序集B的目录。

在A中,不使用Import属性,而是在代码中调用容器上的GetExportedValue<T>()。代码看起来像这样:

// Known by A and B
public interface CommonInterface 
{
   // ...
}
// In B, not A
[Export(typeof(CommonInterface))]
public class BClass : CommonInterface
{
   // ...
}
// In A where you want to manually create class B
CommonInterface objB = _container.GetExportedValue<CommonInterface>();

然后我想手动实例化类的对象。

也许您最好手动加载程序集并从中选择所需的类型,而不是使用MEF。