gpt4 book ai didi

.net - 覆盖 MEF 组合

转载 作者:行者123 更新时间:2023-12-02 01:36:42 24 4
gpt4 key购买 nike

如何重写 MEF 组合,以便如果导入构造函数请求单个依赖项,并且此所需依赖项有多个实现,那么它将采用具有最高优先级(元数据)的实现(导出)?

[Export(typeof(IService))]
[ExportMetadata("Priority", 1)]
public class Service1 : IService
{
}

[Export(typeof(IService))]
[ExportMetadata("Priority", 2)]
public class Service2 : IService
{
}

public interface IService
{
}

public class ServiceWithDependencies
{
[ImportingConstructor]
public ServiceWithDependencies(IService service)
{

}
}

ServiceWithDependency 通常不会得到满足,因为 IService 的实现有多个。但我想修改 MEF(覆盖/拦截某些内容),以便它使用优先级元数据并将具有最高优先级的实现注入(inject)到 ServiceWithDependency 构造函数中。

编辑 1

我不希望 MEF 决定我做事的方式。我希望它尽可能不可见。此外,这是一个框架,我无法控制人们如何需要依赖项。我需要支持基本的构造函数注入(inject)。我了解 [ImportMany],但这个问题恰恰是关于构造函数注入(inject)的。

最佳答案

您也可以将它们放在不同的目录中,然后prioritize the catalogs,而不是将优先级元数据放在您的部件上。 .

在我们的应用程序中,我们利用这一点为 plugins 文件夹中的部分提供最高优先级,然后是应用程序 exe 中的部分,最后是所有其他库。

编辑:这是完整的示例。

首先,类型:

[Export(typeof(IService))]
public class Service1 : IService { }

[Export(typeof(IService))]
public class Service2 : IService { }

public interface IService { }

[Export]
public class ServiceWithDependency
{
[ImportingConstructor]
public ServiceWithDependency(IService service)
{
}
}

[Export]
public class ServiceWithMultipleDependencies
{
[ImportingConstructor]
public ServiceWithMultipleDependencies(
[ImportMany] IEnumerable<IService> services)
{
}
}

以下是设置容器的方法:

var priorityCatalog = new TypeCatalog(typeof(Service1));
var priorityProvider = new CatalogExportProvider(priorityCatalog);

var mainCatalog = new TypeCatalog(
typeof(ServiceWithDependencies),
typeof(ServiceWithMultipleDependencies),
typeof(Service2));
var mainProvider = new CatalogExportProvider(mainCatalog);

// priorityProvider gets priority because it is first
var container = new CompositionContainer(
priorityProvider, mainProvider);
priorityProvider.SourceProvider = container;
mainProvider.SourceProvider = container;

// will get constructed with Service1
var foo = container.GetExportedValue<ServiceWithDependency>();

// will get constructed with both, proving that both are available
var bar = container.GetExportedValue<ServiceWithMultipleDependencies>();

关于.net - 覆盖 MEF 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com