【问题标题】:How to use repository in factory如何在工厂中使用存储库
【发布时间】:2011-05-24 20:01:27
【问题描述】:

嗨 我正在尝试按照 DDD 进行申请。我有以下实体:

公共类项目 { 公共类别类别{获取;受保护的集合; } ... } 公共类SpecificItem:项目 { ... } 公开课类别 { 公共静态 int IdOfCategoryForSpecificItem = 10; 公共 int ID { 获取;放; } }

现在我想用创建 SpecificItem 类型对象的方法创建 factory。但是这个特定的项目必须在特定的类别中。所以我创建了这样的工厂:

公共类 ItemFactory { 公共静态SpecificItem CreateSpecificItem(对象someArguments) { IRepository repository = null // 如何获取存储库? 返回新的SpecificItem { 类别 = repository.FirstOrDefault(i => i.Id == Category.IdOfCategoryForSpecificItem), // 额外的初始化 }; } }

现在我的问题是:

  1. 创建工厂和使用仓库的方法正确吗?
  2. 如何获取存储库?我不能使用 DI,因为它是静态方法。我不喜欢 ServiceLocator,因为它很难进行单元测试。
  3. 也许有更好的解决方案来解决这个问题。

【问题讨论】:

    标签: c# domain-driven-design repository factory


    【解决方案1】:

    重写您的ItemFactory 以使用依赖注入并使用构造函数注入注入IRepository<Category>。完成此操作后,ItemFactory 将如下所示:

    public class ItemFactory
    {
        private readonly IRepository<Category> repository;
    
        public ItemFactory(IRepository<Category> repository)
        {
            this.repository = repository;
        }
    
        public SpecificItem CreateSpecificItem(object someArguments)
        {
            return new SpecificItem
            {
                 Category = this.repository.FirstOrDefault(i => 
                     i.Id == Category.IdOfCategoryForSpecificItem),
                 // additional initialization
            };
        }
    }
    

    这样,您将检索IRepository&lt;Category&gt; 的实现的责任转移给了调用者。现在您可以对所有需要ItemFactory 的类型执行相同的操作。在这些类型的构造函数中注入 ItemFactory 作为依赖项。一直执行此操作,直到应用程序类型层次结构的顶部,并组合它们的类型(composition root)。

    尤其是 IoC/DI 框架将非常方便地为您自动创建类型。

    【讨论】:

    • 我唯一担心的是 Category 似乎至少在 DDD 意义上不应该有一个存储库,因为它不为聚合根提供持久性服务。在这里使用 ORM 级别的存储库可能是有意义的,因为至少我的理解是工厂实现仍被视为应用程序基础架构。
    • IRepository 应该是不可变的吗?如果不是,那么工厂将为相同的参数产生不同的结果。
    【解决方案2】:

    我认为这是对语法的困惑正在引导您找到更好的解决方案的时代之一。

    您可能希望为每个类使用不同的存储库,这正是 DI 可以为您做的事情,而静态属性会阻止。

    但我也认为您在这里混淆了您的名字 - 工厂创建某种类型的新项目,而存储库存储/保留该类型的项目。您是在创建还是检索?

    我的建议是将它们分开 - 实现一个工厂来创建新的和一个存储库来保存/检索现有的。使用 DI 在运行时根据类型决定哪个具体实现。

    【讨论】:

      【解决方案3】:

      我建议制作 DaoService 类。 Dao 组织对数据的访问,而 Service 使用 Dao 来管理数据。架构是:
      1) 道类正在获取数据
      2) 服务类正在形成存储库
      3) 为您的工厂提供存储库的服务类
      这是非常笼统的架构,但我希望我的回答对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多