C# 从MEF中的基接口派生接口时如何导出类型

C# 从MEF中的基接口派生接口时如何导出类型,c#,dependency-injection,inversion-of-control,mef,ioc-container,C#,Dependency Injection,Inversion Of Control,Mef,Ioc Container,下面是我的情景。我试图通过在初始引导期间使用导出功能将类型与接口相关联。然而,MEF抱怨ImportCardinalismatchException。我是MEF的新手,不知道这里出了什么问题?最简单的修复方法是删除继承。然而,我想避免它 public interface IColourService { Color GetColourByCountry(string countryName); } public interface IKnownCo

下面是我的情景。我试图通过在初始引导期间使用导出功能将类型与接口相关联。然而,MEF抱怨ImportCardinalismatchException。我是MEF的新手,不知道这里出了什么问题?最简单的修复方法是删除继承。然而,我想避免它

   public interface IColourService
    {
        Color GetColourByCountry(string countryName);
    }

    public interface IKnownColourService:IColourService
    {
        bool IsKnownCountry(string countryName);
    }

    public interface IUnKnownColourService:IColourService
    {
       bool IsUnKnownCountry(string countryName);
    }

    [Export(typeof(IColourService))]
    public class ColourService:IColourService
    {
       //implementation
    }

    [Export(typeof(IKnownColourService))]   
    public class KnownColourService:IKnownColourService
    {
       //implementation
    }

    [Export(typeof(IUnKnownColourService))]
    public class UnknownColourService:IUnKnownColourService
    {
       //implementation
    }
不能将IColourService用作所有类的导出属性中的类型吗

[Export(typeof(IColourService))]
然后,您可以通过以下属性声明访问它们:

[ImportMany]
public IEnumerable<IColourService> ColourServices { get; set; }
并添加助手方法以获取特定类型:

public IEnumerable<T> GetServices<T>()
{
    return ColourServices.OfType<T>().ToList();
}

希望这有帮助……

您的问题可能是您有三个有效的IColorService对象,而MEF希望只找到一个。我希望通过使用命名导入来解决这个问题。如果我强烈认为这是问题所在,这将是一个答案。@Magus将检查命名导入。