簡體   English   中英

MEF和工廠,直接導入創建的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM