在MEF中使用RegistrationBuilder时,通用失效

时间:2013-04-25 03:35:44

标签: c# generics mef

我想使用RegistrationBuilder创建零件。

示例:

public interface IModel
{
    String Name { get; }
}

public interface IRepository
{
}

class ModelOne : IModel
{
    public String Name { get { return "ModelOne"; } }
}

class ModelTwo : IModel
{
    public String Name { get { return "ModelTwo"; } }
}

public interface IRepository<TModel> : IRepository where TModel : IModel
{
}

public class Repository<TModel> : IRepository<TModel> where TModel : IModel
{
}

static void Main(String[] args)
{
    var builder = new RegistrationBuilder();
    builder.ForTypesDerivedFrom<IModel>()
        .Export()
        .Export<IModel>();
    builder.ForTypesDerivedFrom<IRepository>()
        .ExportInterfaces();
    var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), builder);
    var container = new CompositionContainer(asmCatalog);
    var one = container.GetExportedValue<IRepository<ModelOne>>();
    var two = container.GetExportedValue<IRepository<ModelTwo>>();
}

我无法得到我想要的结果(一,二)。

因为当我使用RegistrationBuilder时使用ProjectingType包装所有类型,但GetExportedValue方法没有在ProjectingType中包装通用参数。

我的临时解决方案是删除ProjectingType中的IsAssignableFrom方法。现在我可以得到我想要的结果(一,二)。

有什么好的解决方法或更正吗?

0 个答案:

没有答案