1

我已经开始与 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; }
}
4

2 回答 2

1

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

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

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

于 2013-02-03T19:57:32.690 回答
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; }
}    

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

于 2013-02-03T22:31:35.953 回答