我想使用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方法。现在我可以得到我想要的结果(一,二)。
有什么好的解决方法或更正吗?