MEF和工厂,直接导入创建对象

时间:2013-02-03 19:45:07

标签: c# import mef factory

我已经开始与MEF合作了。在我的应用程序中,我有一些模型的工厂。 我的工厂有2种创建方法;一个名称作为参数,另一个作为类型。

[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; }
}

2 个答案:

答案 0 :(得分:1)

您无法将[Import]属性的参数传递给正在导入的类型的方法。

我认为如果可以的话你不应该这样做,因为做这样的导入会导致你的类被构造,并且它很可能是过早构造的。您应该延迟对象的构造,直到实际需要它为止。通过直接导入,您将失去这种懒惰的行为。

此外,工厂通常需要一些参数来构造类型,但这不是这种情况。如果你必须直接导入,你可以只导入类型本身,而不是工厂(当然你将失去以后通过改变工厂行为轻松操纵结构的选项)。

答案 1 :(得分:0)

您可以向导出添加合同名称,然后在导入零件时使用它们。

对于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; }
}    

如您所见,您根本不必使用蚂蚁工厂。 MEF将成为您的工厂。