MEF:使用CreationPolicy.NonShared时将不同的构造函数参数传递给零件。

问题描述 投票:10回答:2
我知道关于使用MEF进行构造函数参数注入的很多问题,但我的有所不同。

我想知道当我使用PartCreationPolicy(CreationPolicy.NonShared)GetExportedValue的组合时,有什么方法可以将不同的参数值传递给零件的构造函数吗?

例如:

[PartCreationPolicy(CreationPolicy.NonShared)] [Export] public partial class Foo { [ImportingConstructor] public Foo([Import("SomeParam")]object parameter) { ... } }

以及其他地方...

container.ComposeExportedValue("SomeParam", "Some value..."); var instance = container.GetExportedValue<Foo>();

在上述示例中,我只能使用ComposeExportedValue一次,因为第二次运行将导致ChangeRejectedException。所以,我的问题是:

    在上述情况下,对于每个新实例,还有其他方法可以更改SomeParam的值吗?
  1. 如果没有,在不使用任何其他DI框架的情况下,还有哪些其他方法可以实现?我想到的一件事情是创建一个服务,以暴露类似于System.Collections.Concurrent.ConcurrentQueue的东西,在调用GetExportedValue之前我先将参数值放入队列,然后在部件的构造函数中使该值出队。但这是骇客行为,还会带来更多无法解决的问题。
  2. 如果以上两个问题的答案都为否,那么是否还有其他方法可以通过结合MEF和其他DI / IOC框架来实现这一目标?
  3. 感谢您的帮助。 :)此致,Yogesh Jagota

我知道关于使用MEF注入构造函数参数有很多问题,但是我的有所不同。我想知道有什么方法可以将不同的参数值传递给...

c# dependency-injection inversion-of-control mef
2个回答
2
投票
如果以上两个问题的答案都为否,那么是否还有其他方法可以通过结合MEF和其他DI / IOC框架来实现这一目标?

1
投票
如果要根据MEF中的某些逻辑(应用策略模式)使用同一接口的不同实例,则是使用ExportMetadata属性的一种方法。例如,如果您有IDbManager,并且有两个实现,则说一个Oracle和一个Sql,然后1.创建将包含元数据的元数据界面
© www.soinside.com 2019 - 2024. All rights reserved.