我有一个接口IRepository,它以统一的方式映射到GenericRepository类。
IOC.Container.RegisterType<IRepository, GenericRepository>();
(GenericRepository采用ObjectContext(实体框架上下文)来执行其数据操作)
问题是我需要几个不同的GenericRepository实例。 (我的解决方案中有几个Entity Framework模型)
在业务层逻辑的每个部分中,我需要解析IRepository并获取为模型初始化的GenericRepository,该模型对应于业务层逻辑的那部分。
我需要一些方法来设置选项...我不知道这是否是我独有的问题,或者其他人是否也有此问题。
有没有办法告诉Unity如何做到这一点?
注意:我不希望将ObjectContext的实例作为参数传递给Resolve方法。如果我这样做,那么我就会破坏Repository模式的目的(抽象数据层,以便我可以轻松地进行单元测试)。
答案 0 :(得分:1)
我认为这会奏效:
IOC.Container.RegisterType<IRepository, GenericRepository>("ModelOne",
new InjectionConstructor(new ModelOneEntities());
IOC.Container.RegisterType<IRepository, GenericRepository>("ModelTwo",
new InjectionConstructor(new ModelTwoEntities());
.....
IRepository modelOneRepository = IOC.Container.Resolve<IRepository>("ModelOne");
基本上,您为每个注册命名,并提供使其不同的构造函数参数。然后在解析时使用该名称(尽管我建议使用const
值而不是魔术字符串。)
答案 1 :(得分:0)
您是否可以让特定的存储库实现定义自己的接口?所以像这样:
IOC.Container.RegisterType<IModel1Repository, GenericRepository>();
IOC.Container.RegisterType<IModel2Repository, GenericRepository>();
interface IModel1Repository : IRepository
interface IModel2Repository : IRepository
class GenericRepository : IModel1Repository
{
// Model1 specific ObjectContext
}
class GenericRepository : IModel2Repository
{
// Model2 specific ObjectContext
}
然后您可以根据模型特定的存储库进行查找。