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