0

也许我对自己太苛刻了,但我真的很想知道这一点。我有一个非常顽皮的构造函数,所以我想我可以使用 MEF 让我的生活变得简单。但我是不对的。我真的用过谷歌,但我发现的和这个相比什么都没有。

我有一个这样的构造函数:

public BussinesProcessLoader(ILoader<List<Resource>> resourceLoader, ILoader<List<Project>> projectsLoader)
{
    this.resourceLoader = resourceLoader;
    this.projectsLoader = projectsLoader;
}

现在我想使用 MEF 并让它像这样组成 BussinesProcessLoader:

new BussinesProcessLoader(new Loader<List<Resource>>(new Projects.Deserializer.ResourceDeserializer(), fileResolver), new Loader<List<Project>>(new ProjectsDeserializer(), fileResolver))

所以我发现我无法像这样导出两个类实例:

internal class Loader<T> : ILoader<T>
{
    public Loader(IDeserializer<T> deserializer, FileResolver fileResolver)
    {
        this.Deserializer = deserializer;
        this.FileResolver = fileResolver;
    }

    public IDeserializer<T> Deserializer { get; set; }

    public FileResolver FileResolver { get; set; }

    ...
}

我需要两个不同的 ImportingConstructor 属性和两个带有 contractName 的 Exports ...

...并像这样修改 BussinesProcessLoader 的构造函数:

[ImportingConstructor]
public BussinesProcessLoader([Import("ResourceLoader")] ILoader<List<Resource>> resourceLoader, [Import("ProjectsLoader")] ILoader<List<Project>> projectsLoader)
{
    this.resourceLoader = resourceLoader;
    this.projectsLoader = projectsLoader;
}

甚至有可能做到这一点吗?任何帮助,将不胜感激。

4

1 回答 1

1

我认为您的导出需要两个不同的具体类:

[Export(typeof(ILoader<List<Resource>>))]
internal class ResourceLoader : Loader<List<Resource>>
{
   [ImportingConstructor]
   public ResourceLoader(IDeserializer<List<Resource>> deserializer, FileResolver fileResolver) : base(deserializer, fileResolver)
   {
   }
}

[Export(typeof(ILoader<List<Project>>))]
internal class ProjectLoader : Loader<List<Project>>
{
   [ImportingConstructor]
   public ProjectLoader(IDeserializer<List<Project>> deserializer, FileResolver fileResolver) : base(deserializer, fileResolver)
   {
   }
}

您需要向构造函数添加[ImportingConstructor]属性BussinesProcessLoader,但不需要[Import("...")]参数上的属性。

于 2012-11-21T17:32:19.570 回答