在MEF中放置两个命名实例

时间:2011-03-14 22:14:07

标签: .net mef

在Unity中我会做这样的事情:

Container.RegisterType<MyClass>("MyNamedInstance", new ContainerControlledLifetimeManager());

然后我可以在同一个类中放置多个实例。

我怎样才能在MEF中这样做?

2 个答案:

答案 0 :(得分:4)

在最新预览版本(MEF 2 Preview 3)中添加了命名导出作为MEF's Convention Model的一部分(请参阅“显式布线”部分)。

但是,.NET 4中尚未提供此功能。此外,预览版中的API可能会发生变化。

现在,您可以通过将名称添加到导出合同中为同一个类创建两个具有不同合同的导出:

public class MyClass
{
}

public class MyClassExporter
{

   [Export("Name1", typeof(MyClass))]
   public MyClass Name1
   {
       get
       {
           return new MyClass();
       }
   }

   [Export("Name2", typeof(MyClass))]
   public MyClass Name2
   {
       get
       {
           return new MyClass();
       }
   }
}

然后您可以使用相同的合同进行导入:

[Export(typeof(IFoo))]
public class Foo : IFoo
{
   [ImportingConstructor]
   public Foo([Import("Name2", typeof(MyClass))] MyClass myClass)
   {
       ...
   }
}

您可以将导出属性放在派生类上,而不是使用带有属性导出的MyClassExporter,这可能更容易理解,但不适用于sealed类:

[Export("Name1", typeof(MyClass)]
public class MyClass1 : MyClass
{
}

[Export("Name2", typeof(MyClass)]
public class MyClass2 : MyClass
{
}

答案 1 :(得分:1)

ExportAttribute Class

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Property|AttributeTargets.Field, AllowMultiple = true, 
    Inherited = false)]
public class ExportAttribute : Attribute

它标记为AllowMultiple = true ...这意味着您可以执行以下操作:

[Export("MyClass1")]
[Export("MyClass2")]
[PartCreationPolicy(CreationPolicy.NonShared)] //Otherwise they'll point to the same reference.
public class MyClass : IMyClass
{
    ...
}