我已经开始与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; }
}
答案 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将成为您的工厂。