也许我对自己太难了,但我真的想知道这一点。我有一个非常顽皮的构造函数所以我认为我可以使用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;
}
甚至可以实现这一目标吗?任何帮助将不胜感激。
答案 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("...")]
属性。