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

Yog*_*esh 10 c# dependency-injection mef inversion-of-control

我知道有很多关于使用MEF的构造函数参数注入的问题,但我的有点不同.

我想知道,有没有什么办法,以不同的参数值传递给当我使用的组合部分的构造PartCreationPolicy(CreationPolicy.NonShared)GetExportedValue

例如:

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

和其他地方......

container.ComposeExportedValue("SomeParam", "Some value...");
var instance = container.GetExportedValue<Foo>();
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我只能使用ComposeExportedValue一次,因为第二次运行会导致a ChangeRejectedException.

所以,我的问题是:

  1. SomeParam对于每个新实例,还有其他方法可以更改上述场景中的值吗?
  2. 如果没有,在不使用任何其他DI框架的情况下,可以实现的其他方法是什么?我想到的一件事是创建一个服务来暴露一些东西,比如System.Collections.Concurrent.ConcurrentQueue我在调用之前将参数值排入队列GetExportedValue,然后在部件的构造函数中将值取列.但这是一个黑客攻击,也会产生比它解决的问题更多的问题.
  3. 如果以上两个问题的答案都是否定的,那么有没有其他方法可以通过MEF和其他DI/IOC框架的组合实现这一目标?

谢谢你的帮助.:)
问候,
Yogesh Jagota

Wim*_*nen 2

如果上述两个问题的答案是否定的,那么是否有其他方法可以结合 MEF 和其他 DI/IOC 框架来实现此目的?

我认为问题1和2的答案确实是否定的。

我会尝试AutoFac,它为您提供更细粒度的控制并与 MEF 集成。例如,它允许您像这样设置注册,以便Bar实例使用不同的参数Baz获取其实例:Foo

builder.Register(c => new Bar(new Foo(param));
builder.Register(c => new Baz(new Foo(param2));
Run Code Online (Sandbox Code Playgroud)