1

我只想使用 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 方法。现在我可以得到我想要的结果(一个,两个)。

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

4

0 回答 0