如何在没有共享接口的情况下在 MEF 中制作"discoverable"服务?



这是场景。

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

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

我通常会使用两个程序集引用的共享接口,但在这种情况下,程序集ab直到运行时才知道彼此。

共享接口允许在应用适当的类型转换后以早期绑定(静态类型(方式使用值,这要归功于多态性。虽然需要成为各方之间的常识,但共享接口也可以在外部程序集中维护 - 这通常是我使用的方法。

还有结构类型(此术语 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;
    }
}

相关内容

  • 没有找到相关文章

最新更新