使用来自另一个MEF程序集的类而不引用它

时间:2011-06-09 09:22:19

标签: c# .net .net-4.0 components mef

我有2个MEF组件。让它成为A组分和B组分。

我需要的是能够从组件A中的组件B访问类而不参考它。然后我想手动实例化该类的对象。

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

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

3 个答案:

答案 0 :(得分:1)

如果没有对文件的硬引用,您可以instantiate a class via reflection。你不需要MEF。

答案 1 :(得分:0)

  

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

也许你最好通过加载程序集并从中选择所需类型而不是使用MEF来手动完成。

答案 2 :(得分:0)

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

首先,您需要定义两个程序集都能理解的公共接口。这可能是这两个程序集引用的“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>();