导出两个泛型类型的实例

时间:2012-11-21 15:59:43

标签: c# .net inversion-of-control mef

也许我对自己太难了,但我真的想知道这一点。我有一个非常顽皮的构造函数所以我认为我可以使用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的导出...

...并修改BussinesProcessLoader的构造函数,如下所示:

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

甚至可以实现这一目标吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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("...")]属性。