MEF通用导入

4

我有以下使用MEF的示例代码:

public interface IFoo<T> 
{}

public class Foo<T> : IFoo<T> 
{}

[Export(typeof(IFoo<String>))]
public class Foo : Foo<String> 
{}

public class Bar<T>
{
   [Import]
   private readonly IFoo<T> foo;
}

static void Main()
{
   var catalog = new AggregateCatalog();
   catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
   var container = new CompositionContainer(catalog);
   container.ComposeParts();

   var bar = new Bar<String>();
   //bar.foo would be null
}

这似乎不起作用 - foo字段是null。这是因为它的类型没有被MEF视为IFoo<String>吗?


在类Foo的声明中,你有Foo<String>:IFoo<String>。这声明了一个泛型类型,名称为String,但它并没有使用实际的字符串类。你所拥有的等同于Foo<T>:IFoo<T>。如果你想让Foo不是泛型的,总是作为IFoo<System.String>,你需要做的是Foo:IFoo<String>。如果你想让类Foo成为泛型的,我会将你的泛型类型重命名为<T>,以使其更清晰易懂。 - David Yaw
感谢您发现这个错误 - 我过于简化了问题,错过了一个额外的声明。我已经重新编辑过了,现在Foo<T>实现了IFoo<T>,而Foo继承自Foo<String>(并导出IFoo<String>)。 - Lee Atkinson
1个回答

8

foo是null,因为您自己创建了实例。您需要让容器创建实例。

此外,如果您计划导入/导出泛型,建议查看GenericCatalog


谢谢Tom - 我意识到我没有组合酒吧 - 但是被认为这是一个通用问题而不是我的编码错误所蒙蔽了。 - Lee Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接