2011-03-14 45 views
1

在Unity我會做這樣的事:我怎樣才能做到這一點在MEF把兩個命名實例在MEF

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

然後我可以把同一類的多個實例在

回答

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 
{ 
} 
+0

ExportAttribute設置爲=的AllowMultiple真實。我敢肯定,這意味着你可以標記一個具有多個命名導出的類:) – 2011-03-15 03:20:48

+0

@myermian:在同一個類上有多個導出不會真正導致「命名實例」,因爲不可能創建兩個單獨的單身這樣。另請參閱我對您的答案的評論。 – 2011-03-15 10:30:22

+0

這是一些瘋狂的語法 – zachary 2011-03-15 21:47:45

1

ExportAttribute Class

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

它標誌着=的AllowMultiple真的...這意味着你可以做到以下幾點:

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

我之所以沒有在自己的答案中提出這個建議,是因爲這不允許你創建兩個單例。 **「MyClass1」的每個導入器都會得到一個新的對象**,當你想要一個「命名實例」時,這實際上並不是你想要的。 – 2011-03-15 10:27:46

+0

@Wim,是的,我同意。你不會得到2個單身人士。但是,作者沒有說他想要「同一班的多個實例」,這對我來說聽起來像是他想要非單身人士。如果他的意圖是有2個單身人士,那麼是的,你的解決方案是正確的。 – 2011-03-15 12:13:22