【问题标题】:Resolving with rules in Unity?使用 Unity 中的规则解决问题?
【发布时间】:2011-08-09 17:48:52
【问题描述】:

我有接口 IRepository,它统一映射到类 GenericRepository。

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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 值而不是魔术字符串)。

    【讨论】:

      【解决方案2】:

      您能否让特定的存储库实现定义自己的接口?所以是这样的:

      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
      }
      

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

      【讨论】:

      • 是的,我能做到。但我可能会有很多模型,这是相当多的额外工作。我将保留此解决方案作为备用计划。 --- 我一直在研究这个问题,我发现 Unity 允许在调用 RegisterType 时使用名称。我想知道当我调用 Resolve 时是否可以使用。唯一的问题是我需要传入我想要用于每个命名的 RegisterType 调用的构造函数(还没有弄清楚这是否可能。)
      猜你喜欢
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2019-08-28
      • 1970-01-01
      相关资源
      最近更新 更多