这是场景。
程序集main
使用MEF将程序集a
和程序集b
加载到应用程序域中。现在我们假设程序集a
和b
都提供了可以使用的服务。
程序集a
是否可以在运行时调用/实例化程序集b
中的类,而无需引用?基本上可以使服务"可被发现"?
我通常会使用两个程序集引用的共享界面,但在这种情况下,程序集a
和b
在运行时之前不会彼此了解。
答案 0 :(得分:1)
在应用了适当的类型转换之后,由于Polymorphism,共享接口允许以早期绑定(静态类型)方式使用该值。虽然需要在各方之间保持共识,但共享接口也可以在外部程序集中维护 - 这通常是我使用的方法。
还有结构类型(这个术语在C#/ .NET中使用不) - 基本上在消费者中有一个不同的接口/类型匹配消费的类型。有问题的对象以静态类型的方式访问(通过消费者中定义的类型),但用作动态代理。有关详细信息/限制以及实施的一些链接,请参阅How to make a simple dynamic proxy in C#。
但是,如果上述方法都不起作用,则只能使用后期绑定(动态类型) - 示例为Reflection,其中包含对象值或dynamic
-typed表达式。有些人喜欢它,但我更喜欢早期绑定。这绝对是最“灵活”的方法。
答案 1 :(得分:0)
这是我的看法:
您只需要一个接口即可使用MEF。哇,您甚至根本不需要它,您可以解析类型为object
的命名合同,该合同返回一个对象,并且该对象可以执行其所需的任何操作,例如通过MEF对其OWN库中的合同解析其他依赖项。 / p>
[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;
}
}