c# - 自定义 'ExportFactory'

标签 c# export mef factory

使用 MEF 的桌面应用程序导入许多“ServiceProvider”。每个部分 (ServiceProvider) 都是单独 DLL 中的一个类。 所有 DLL 都在桌面应用程序使用的“插件”文件夹中。

因为我需要我的部件的新实例,ExportFactory 是最佳选择。问题是我的零件有构造函数。我需要将一些参数传递给 ExportFactory(MEF2、Preview2)不支持的部分的构造函数。

我需要这样的东西:

// Each part has its own dependency
Dependency dependency = LoadDependency(myPart.Metedata["Name"]);
// Injecting dependency into part's constructor
myPart.CreateExport(dependency);

我不想从我的零件端导入任何东西。

可以找到示例项目(带有无参数构造函数)here .

最佳答案

当 MEF 发现类型为 ExportFactory<IFoo> 的导入时,它以一种特殊的方式处理这个问题。而不是字面上寻找 ExportFactory<IFoo>导出时,它会查找 IFoo导出并神奇地为该类型生成一个工厂。

你的错误是你希望这个魔法也能自动为你自己的 ExportFactory 替代工作。你称之为SrviceProviderFactory .这不是真的。当您导入 SrviceProviderFactory<IFoo,IFooMetadata>在某处,MEF 确实在寻找该类型的导出。

直接的解决方案是为其提供此导出。为每个 IServiceProvider 实现手动导出一个工厂。例如,如果您有一个 FooServiceProvider :

public class FooServiceProvider : IServiceProvider
{
    public FooServiceProvider(Dependency dependency)
    {
        ...
    }
}

然后你还需要有一个 FooServiceProviderFactory:

[Export(typeof(IServiceProviderFactory))]
[ExportMetaData("foo", "bar")]
public class FooServiceProviderFactory : IServiceProviderFactory
{
    public IServiceProvider CreateServiceProvider(Dependency d)
    {
       return new FooServiceProvider(d);
    }
}

然后您的进口商可以根据元数据选择合适的工厂:

public class FactoryUser
{
    [ImportMany]
    public Lazy<IServiceProviderFactory,IDictionary<string,object>>[] Factories 
    {
        get;
        set;
    }

    public void DoSomething()
    {
       var factory = Factories.First(x => x.Metadata["foo"] == "bar").Value;
       var serviceProvider = factory.CreateServiceProvider(someDependency);
       ...
    }
}

这里令人讨厌的是,对于每个服务提供者实现,您还需要创建和导出一个工厂实现。您可以通过创建通用工厂基类(例如 SrviceProviderFactory )来节省工作,但您仍然必须派生特定类,因为您不能在 MEF 导出中使用泛型类型参数。 更新:我相信 .NET 4.5 现在支持导出开放泛型类型。

这就是为什么 I already suggested you export Func instead ,但显然您不喜欢这个答案。

您也可以尝试复制 ExportFactory魔法。这是可能的,但是 MEF 的一个非常高级的用例。如果你想这样做,我建议你看一下 ExportFactoryProvider 的 MEF 来源。了解如何构建您自己的支持参数的实现。

关于c# - 自定义 'ExportFactory',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4417437/

相关文章:

c# - ASP.net 中的流畅模型绑定(bind)

ruby-on-rails - 有谁知道与从Rails应用程序将事件导出到iCal,Google日历,Outlook相关的gem/plugins/tutorials吗?

c# - 如何在 Prism4 MEF 中创建我的类的实例?

silverlight-4.0 - Mef,将参数传递给模块

c# - 如何使用 MEF 导入多个实例?

c# - 如何使用httpClient在没有太多请求的情况下循环通过rest api

c# - 如何使用 ADO.NET 从具有一对多关系的 DAL 层中的多个表返回数据

c# - 根据参数过滤对象列表

python - 有没有人有 Scrapy 中 sqlite 管道的示例代码?

mobile - 如何将项目作为Docker从IBM Bluemix PaaS导出到其他任何地方?