如何在没有共享接口的情况下在MEF中创建“可发现”服务?

时间:2014-08-29 00:42:59

标签: c# reflection mef .net-assembly

这是场景。

程序集main使用MEF将程序集a和程序集b加载到应用程序域中。现在我们假设程序集ab都提供了可以使用的服务。

程序集a是否可以在运行时调用/实例化程序集b中的类,而无需引用?基本上可以使服务"可被发现"?

我通常会使用两个程序集引用的共享界面,但在这种情况下,程序集ab在运行时之前不会彼此了解。

2 个答案:

答案 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;
    }
}