在Unity我會做這樣的事:我怎樣才能做到這一點在MEF把兩個命名實例在MEF
Container.RegisterType<MyClass>("MyNamedInstance", new ContainerControlledLifetimeManager());
然後我可以把同一類的多個實例在
?
在Unity我會做這樣的事:我怎樣才能做到這一點在MEF把兩個命名實例在MEF
Container.RegisterType<MyClass>("MyNamedInstance", new ContainerControlledLifetimeManager());
然後我可以把同一類的多個實例在
?
看起來在最新的預覽版本(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
{
}
[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
{
...
}
我之所以沒有在自己的答案中提出這個建議,是因爲這不允許你創建兩個單例。 **「MyClass1」的每個導入器都會得到一個新的對象**,當你想要一個「命名實例」時,這實際上並不是你想要的。 – 2011-03-15 10:27:46
@Wim,是的,我同意。你不會得到2個單身人士。但是,作者沒有說他想要「同一班的多個實例」,這對我來說聽起來像是他想要非單身人士。如果他的意圖是有2個單身人士,那麼是的,你的解決方案是正確的。 – 2011-03-15 12:13:22
ExportAttribute設置爲=的AllowMultiple真實。我敢肯定,這意味着你可以標記一個具有多個命名導出的類:) – 2011-03-15 03:20:48
@myermian:在同一個類上有多個導出不會真正導致「命名實例」,因爲不可能創建兩個單獨的單身這樣。另請參閱我對您的答案的評論。 – 2011-03-15 10:30:22
這是一些瘋狂的語法 – zachary 2011-03-15 21:47:45