这是场景。
程序集main
使用 MEF 将程序集a
和程序集b
加载到应用程序域中。现在假设程序集a
和b
都提供可以使用的服务。
程序集a
是否可以在运行时调用/实例化程序集b
中的类,而无需引用?本质上是使服务"可发现"?
我通常会使用两个程序集引用的共享接口,但在这种情况下,程序集a
和b
直到运行时才知道彼此。
共享接口允许在应用适当的类型转换后以早期绑定(静态类型(方式使用值,这要归功于多态性。虽然需要成为各方之间的常识,但共享接口也可以在外部程序集中维护 - 这通常是我使用的方法。
还有结构类型(此术语在 C#/.NET 中未使用( - 基本上在使用者中编写了不同的接口/类型,以便它与使用的类型匹配。有问题的对象以静态类型方式(通过使用者中定义的类型(访问,但充当动态代理。请参阅如何在 C# 中创建简单的动态代理,了解详细信息/限制和一些实现链接。
但是,如果上述方法都不起作用,则只能使用后期绑定(动态类型( - 例如具有对象值的反射或dynamic
类型表达式。有些人喜欢它,但我更喜欢早期绑定。这绝对是最"灵活"的方法。
这是我对此的看法:
您只需要一个接口即可使用 MEF。哇,你真的甚至不需要它,你可以解析一个返回对象的 object
类型的命名协定,该对象可以做任何它想做的事情,比如通过 MEF 解析其他依赖项,使用其 OWN 库中的合约。
[Import("MyEntryDelegate",typeof(object))]
public Lazy<object> mefBootstrapper { get; set; }
你有一个由 MEF 为一个通用已知接口解析的对象,所有其他 MEF 解析的对象将在目录中加载的外部 DLL 中发现它们自己的部分。就像摇晃和烘焙 IoC 一样,在您的库中编写自己的接口,并将依赖项[Import]
到您的心内容
在你正在创建的任何对象的构造函数中,你都可以引导任何你想要的东西。
interface INeedSomethingOfMyOwn{
void DoSomething();
}
[Export("MyEntryDelegate",typeof(object))]
class MyClass{
private readonly INeedSomethingOfMyOwn _myobj;
[ImportingConstructor]
public MyClass([Import]INeedSomethingOfMyOwn myobj){
_myobj = myobj;
}
}