C# MEF同一构造函数的多个实例

C# MEF同一构造函数的多个实例,c#,mef,C#,Mef,MEF有没有办法用不同的构造函数参数创建同一类的多个实例 例如 class-MefTest { [测试] 公开无效测试() { var aggregateCatalog=newaggregateCatalog(newtypecatalog(typeof(MyExportType))); var compositionContainer=新的compositionContainer(aggregateCatalog); ComposeExportedValue(“Ctor1”、“construct

MEF有没有办法用不同的构造函数参数创建同一类的多个实例

例如

class-MefTest
{
[测试]
公开无效测试()
{
var aggregateCatalog=newaggregateCatalog(newtypecatalog(typeof(MyExportType)));
var compositionContainer=新的compositionContainer(aggregateCatalog);
ComposeExportedValue(“Ctor1”、“constructor参数1”);
ComposeExportedValue(“Ctor2”,“constructor参数2”);
var exportedValues=compositionContainer.GetExportedValues();
AreEqual(2,exportedValues.Count());
}
}
[出口]
类MyExportType
{
内部字符串名称{get;set;}
[导入构造函数]
内部MyExportType([Import(“Ctor1”)][Import(“Ctor2”)]字符串名称)
{
this.Name=Name;
}
}

该示例将抱怨多重导入属性。

不,没有办法做到这一点

正如您在中所看到的,用
[ImportingConstructor]
属性修饰的.ctor将使用其参数作为导入。必须根据您可选提供的默认策略或属性(例如
[ImportMany]
[import(AllowDefault=true)]
)满足每个导入

因此,您不能根据需要使用.ctor参数,它们是为导入“保留”的

class MefTest
{
    [Test]
    public void Test()
    {
        var aggregateCatalog = new AggregateCatalog(new TypeCatalog(typeof(MyExportType)));

        var compositionContainer = new CompositionContainer(aggregateCatalog);

        compositionContainer.ComposeExportedValue("Ctor1", "Contructor argument 1");
        compositionContainer.ComposeExportedValue("Ctor2", "Contructor argument 2");

        var exportedValues = compositionContainer.GetExportedValues<MyExportType>();

        Assert.AreEqual(2, exportedValues.Count());
    }
}

[Export]
class MyExportType
{
    internal string Name { get; set; }

    [ImportingConstructor]
    internal MyExportType([Import("Ctor1")][Import("Ctor2")]string name)
    {
        this.Name = name;
    }
}