【问题标题】:What kind of logic goes in a repository and what kind goes in a service?什么样的逻辑放在存储库中,什么样的逻辑放在服务中?
【发布时间】:2009-12-12 11:52:03
【问题描述】:

如果服务使用存储库来持久化数据,它不应该在存储库中吗?

【问题讨论】:

  • 对不起,你在说什么?

标签: service repository domain-driven-design


【解决方案1】:

嗯,我认为根据您的问题域和您选择的一般架构,答案是相当主观的。但是,fwiw,这是我的方法:

存储库提供对象存储容器的统一视图。

服务提供在许多情况下使用存储库的功能。

举个例子:我们有一个购物车应用,它需要知道

  1. 如何保存订单
  2. 如何在 多种货币
  3. 列表项如何找到 给定的当前汇率 货币。

这可能是一个结构。

CurrencyRatesRepository
  AddCurrency( "US$" )
  AddCurrency( "EUR" )
  AddEffectiveeRate( "US$", "EUR", 2009/01/01 14:00:00:00.000, 1.5 )


CurrencyService
  rate = GetEffectiveRate( "US$", "EUR" );

ShoppingCartRepositroy
  SaveOrder( orderid=1, "Pair of Shoes", EUR99.99 );
  AddPayment( orderid, "US$", 150 );

现在,ShoppingCart 存储库中的 AddPayment 方法可以调用 currencyserve 上的 GetEffectiveRate 来计算 150 美元的欧元当前价值。

显而易见的问题。为什么不理会服务为什么不直接将 GeteffectiveRate 方法添加到货币存储库中。嗯,答案是 - 将您的购物车业务逻辑与货币存储库分离。这将允许您在以后更改货币存储库。

无论如何,正如我所说,您将某物称为服务还是存储库是非常主观的。但总的来说,我认为服务是一种更高级别的抽象,它提供了分层存储在存储库上的额外逻辑和功能。

希望对您有所帮助。

【讨论】:

  • 我知道答案很主观,但您确实给了我正在寻找的答案,我也以同样的方式思考过。我还想知道为什么要打扰服务而不只是将所有内容添加到存储库中。特别是,当有人使用我的 API 时,如果主观判断是将其投入服务还是回购,可能很难找到一些逻辑......一个人会在回购中寻找它,另一个人会在服务中寻找它......谢谢答案.
【解决方案2】:

我相信埃文斯关于这个主题的前几段非常清楚。

服务用于放置不适合任何特定域对象的逻辑。您的服务是否使用存储库并不重要 - 定义服务的是行为逻辑。

不幸的是,服务 是一个重载的术语 - 很容易将“Web 服务”和“域服务”混为一谈。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多