使用来自另一个 MEF 程序集的类而不引用它
Posted
技术标签:
【中文标题】使用来自另一个 MEF 程序集的类而不引用它【英文标题】:Use classes from another MEF assembly without referencing to it 【发布时间】:2011-09-11 13:12:03 【问题描述】:我有 2 个 MEF 组件。让它成为组件 A 和组件 B。
我需要的是能够从组件 A 中的组件 B 访问一个类而不引用它。然后我想手动实例化该类的对象。
目前我看到 MEF 允许使用 [Import] 自动实例化对象。它使用需要引用的接口。
我可以使用来自其他程序集的数据类型而不引用它吗? MEF是否支持这种机制?
【问题讨论】:
您能否用您希望访问的类型的示例更新您的问题,以及您认为要如何使用它的一些伪代码?跨度> 【参考方案1】:然后我想手动实例化类的对象。
也许您最好通过加载程序集并从中选择所需的类型而不是使用 MEF 手动完成。
【讨论】:
【参考方案2】:有几种方法可以做到这一点。
首先,您需要定义两个程序集都可以理解的通用接口。这可能是这两个程序集都引用的“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>();
【讨论】:
在没有 A 引用 B 的情况下使用 AssemblyCatalog 的唯一方法是通过反射查找程序集。 想通了。创建了一个单独的程序集 C,其中包含与程序集 A 和 B 一起使用的接口、常量和常用类型。A 和 B 都应该引用 C。在这种情况下,“出口和进口合同方”知道他们应该知道的一切(接口、常用类型,常数)。因此,每个 MEF 组件都应该对至少一个至少定义其接口的程序集有强引用。不需要任何其他强引用。 MEF 会处理这个问题。我已经接受了这个答案。谢谢!【参考方案3】:您可以instantiate a class via reflection 无需硬引用该文件。你不需要 MEF。
【讨论】:
MEF 只是让它变得更容易,仅此而已。 是的。通过反射,您甚至不需要硬编码合约(您只需按名称调用方法)。看来这就是 OP 想要的。 是的,这可能很有用,但可能会非常混乱。您仍然会有一个由预期函数名称和参数组成的隐式接口。为什么不定义一个真正的接口,让每个人都知道它是什么并且编译器可以强制执行它? @Josh G - 绝对。如果可以,请使用普遍认可的界面。但是,我已经看到了“Duck Typing”是首选方法的情况。 它需要 MEF 实现。以上是关于使用来自另一个 MEF 程序集的类而不引用它的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JsDoc(VS Code / IntelliSense)中引用另一个文件中的类而不直接导入?
找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040)xamarin 表单 UWP 中的错误?