[英]MEF and factories, import created object directly
我已經開始與MEF合作。 在我的應用程序中,我有一些型號的工廠。 我廠有兩種創建方法; 一個以名稱作為參數,另一個以類型。
[Export(typeof(IFactory))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class MyFactory : IFactory
{
public IModel Create(String name) {...}
public IModel Create(Type type) {...}
}
public class Foo
{
[Import(typeof(IFactory))]
public IFactory Factory { get; set; }
public Foo()
{
IModel modelByName = Factory.Create("name");
IModel modelByType = Factory.Create(typeof(Foo));
}
}
目前,我必須導入一個工廠,然后在工廠對象上調用create以獲得模型。 現在,我想知道是否可以直接導入模型,例如:
[Import(typeof(IModel), Name:"Name")]
public IModel Model { get; set; }
編輯------------------------------------------------- -
目標是替換如下所示的內容:
public class Foo
{
[Import(typeof(IFactory))]
public IFactory Factory { get; set; }
public IModel Model { get; set; }
public IModel Model1 { get; set; }
public Foo()
{
Model = Factory.Create("Foo");
Model1 = Factory.Create(typeof(Foo1));
}
}
像這樣的東西:
public class Foo
{
//Should internal import a IFactory(singeleton) object
//and call the Create(name:String) method on it
[Import(typeof(IModel), Name:"Foo")]
public IModel Model { get; set; }
//Should internal import a IFactory(singeleton) object
//and call the Create(type:Type) method on it
[Import(typeof(IModel), Type: typeof(Foo1))]
public IModel Model1 { get; set; }
}
您不能將[Import]
屬性的參數傳遞給正在導入的類型的方法。
我認為,如果可以的話,您不應該這樣做,因為執行這樣的導入會導致您的類被構造,並且很可能會過早地構造它。 您應該將對象的構造延遲到實際需要的時間為止。 通過直接導入,您將失去這種懶惰的行為。
另外,工廠通常需要一些參數來構造類型,但是這里不是這種情況。 如果絕對必須直接導入,則可以直接導入類型本身,而不是工廠(當然,您將失去以后通過更改工廠的行為輕松操縱構造的選擇)。
您可以將合同名稱添加到導出中,然后在導入零件時使用它們。
對於IModel
接口:
public interface IModel { }
您可以使用合同名稱將實現導出為IModel
:
[Export("Foo1", typeof(IModel))]
public class Foo1 : IModel { }
您還可以在一個類上添加多個導出屬性。 這樣,您就可以滿足兩種類型的導入(按名稱和類型)。
[Export("Foo2", typeof(IModel))]
[Export(typeof(Foo2))]
public class Foo2 : IModel { }
然后您像這樣導入:
public class Foo
{
//Import using the contract name.
[Import("Foo1", typeof(IModel))]
public IModel Model1 { get; set; }
//Import using the actual type.
[Import(typeof(Foo2))]
public IModel Model2 { get; set; }
//Import the same model but with contract name instead of type.
//This is possible because there are two different exports.
[Import("Foo2")]
public IModel Model3 { get; set; }
}
如您所見,您根本不需要使用ant factory。 MEF將成為您的工廠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.