Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 使用MEF为同一导入提供不同的值_C# 4.0_Dependency Injection_Mef - Fatal编程技术网

C# 4.0 使用MEF为同一导入提供不同的值

C# 4.0 使用MEF为同一导入提供不同的值,c#-4.0,dependency-injection,mef,C# 4.0,Dependency Injection,Mef,这个问题与MEF的使用有关 我想在这两种情况下为同一导入提供不同的值 [Export("A1", typeof(IA))] [Export("A2", typeof(IA))] class A : IA { [Import("B")] public IB B; } [PartCreationPolicy(CreationPolicy.NonShared)] [Export(typeof(IA))] class A : IA { [Import] public IB B; }

这个问题与MEF的使用有关

我想在这两种情况下为同一导入提供不同的值

[Export("A1", typeof(IA))]
[Export("A2", typeof(IA))]
class A : IA
{
  [Import("B")]
  public IB B;
}

[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(typeof(IA))]
class A : IA
{
  [Import]
  public IB B;
}
在上述两种情况下,我希望在第一种导出类型中使用不同的值来满足
IB
的导入

var a1 = Container.GetExportedValue<IA>("A1");
var a2 = Container.GetExportedValue<IA>("A1");
var a1=Container.GetExportedValue(“a1”);
var a2=容器.GetExportedValue(“A1”);
或者这是第二次出口

var a1 = Container.GetExportedValue<IA>();
var a2 = Container.GetExportedValue<IA>();
var a1=Container.GetExportedValue();
var a2=Container.GetExportedValue();
我希望A
a1
a2
的两个实例具有不同的
IB
值。我不想使用
ImportMany
,因为那时我必须决定选择哪一个,并且我想将该逻辑保留在类
A
之外


与这些导出相关的两个场景是,我希望有一个通用视图,用于处理不同类型的视图模型,这些视图模型实现了一些接口和一个类的不同实例,该类提供了一些服务,可以使用不同的配置参数进行配置。

我不完全理解您想做什么,但我认为您可以通过在IB导入上指定非共享的创建策略来实现这一点

[Import(RequiredCreationPolicy=CreationPolicy.NonShared)]
public IB B;

我不完全理解您试图做什么,但我认为您可以通过在IB导入上指定非共享的创建策略来完成

[Import(RequiredCreationPolicy=CreationPolicy.NonShared)]
public IB B;

也许你在找这样的东西

public class AExporter
{
    [Export("A1", typeof(IA)]
    public IA A1
    {
        get
        {
             return new A(this.B1);
        }
    }

    [Export("A2", typeof(IA)]
    public IA A2
    {
        get
        {
            return new A(this.B2);
        }
    }

    [Import("B1", typeof(IB))]
    public IB B1 { private get; set; }

    [Import("B2", typeof(IB))]
    public IB B2 { private get; set; }

}

然而,MEF并不是为对合成进行如此细粒度的控制而设计的。您可以尝试类似的替代方案,它与MEF很好地集成。

也许您正在寻找类似的产品

public class AExporter
{
    [Export("A1", typeof(IA)]
    public IA A1
    {
        get
        {
             return new A(this.B1);
        }
    }

    [Export("A2", typeof(IA)]
    public IA A2
    {
        get
        {
            return new A(this.B2);
        }
    }

    [Import("B1", typeof(IB))]
    public IB B1 { private get; set; }

    [Import("B2", typeof(IB))]
    public IB B2 { private get; set; }

}
然而,MEF并不是为对合成进行如此细粒度的控制而设计的。您可以尝试类似的替代方案,它与MEF很好地集成