解决Unity中的规则?

时间:2011-08-09 17:48:52

标签: c# dependency-injection inversion-of-control unity-container

我有一个接口IRepository,它以统一的方式映射到GenericRepository类。

IOC.Container.RegisterType<IRepository, GenericRepository>();

(GenericRepository采用ObjectContext(实体框架上下文)来执行其数据操作)

问题是我需要几个不同的GenericRepository实例。 (我的解决方案中有几个Entity Framework模型)

在业务层逻辑的每个部分中,我需要解析IRepository并获取为模型初始化的GenericRepository,该模型对应于业务层逻辑的那部分。

我需要一些方法来设置选项...我不知道这是否是我独有的问题,或者其他人是否也有此问题。

有没有办法告诉Unity如何做到这一点?

注意:我不希望将ObjectContext的实例作为参数传递给Resolve方法。如果我这样做,那么我就会破坏Repository模式的目的(抽象数据层,以便我可以轻松地进行单元测试)。

2 个答案:

答案 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
}

然后您可以根据模型特定的存储库进行查找。