【问题标题】:Domain-Drive-Design service领域驱动设计服务
【发布时间】:2015-10-27 21:07:14
【问题描述】:

我正在寻找基于域驱动设计编写域服务的最佳(或更好)方法。这是伪代码

public class CustomerAccount
{
    public string AccountNumber {get; set;}
    public string CustomerName  {get; set;}
    public string PhoneNumber {get; set;}
    public string HomeAddress {get; set;}
}

// Domain Service Class
public class AccountService
{
    public virtual void RefreshAccount( CustomerAccount acct)
    {
        // Some code here to refresh the class from cache... 
        cache.refresh( acct )
    }
}

public static class Cache
{
    public static refresh(CustomerAccount acct)
    {
        // refreshing class here.
    } 
}

我的问题是我应该在 AccountService 中有 RefreshAccount() 并以这种方式调用它吗?还是直接调用缓存类?无论哪种方式都很好,但我的问题是,从设计的角度来看,尤其是 DDD,哪种方式最好,为什么?

提前致谢!!

【问题讨论】:

  • 什么是Cache?它是域中的某个术语吗?还是只是出于性能原因用于减少 I/O 的缓存?
  • @Jakub 是的,这是另一个域。
  • 缓存通常属于基础设施层,而不是领域层。域服务本身不需要了解有关缓存的任何信息(除非缓存确实是您的域的一部分),它是客户端(或某些中间应用程序服务)来查询缓存。此外,如果您需要基于某个域事件从缓存中驱逐数据,则该域需要公开该事件,并且可以通知客户端(例如缓存服务)并采取相应的行动。
  • 我同意@haim770。如果这是域功能,您可能希望直接调用域服务而不是 缓存。然而,因为它看起来确实像基础设施,所以缓存可能会驻留在 应用程序 服务中,在这种情况下,考虑到static,它实际上并不重要。如果您可以摆脱静态,而是将缓存注入您的应用程序服务,那就更好了:)
  • 感谢大家的cmets!真的很有帮助!

标签: c# domain-driven-design software-design


【解决方案1】:

Cache 听起来很像基础设施层的一部分,而不是域。如果是这种情况,则应将其从域层中删除。领域模型不应受到技术复杂性的污染。

假设Cache 确实属于域,如果没有关于域的更多信息,很难回答这个问题。

一般:

  • 如果CacheCustomerAccount 是同一聚合的一部分,则应从聚合根访问Cache
  • 如果它们不是同一个聚合但仍属于同一个限界上下文,请使用域服务来执行需要 CustomerAccountCache 的操作。
  • 如果Cache 属于另一个有界上下文,则使用域事件通知它。

如果可能,我建议在 UL 中更改 Cache 的名称。这可能会导致团队中的程序员之间产生误解,尤其是当新人加入团队时。

【讨论】:

    【解决方案2】:

    DDD 和测试驱动开发通常是齐头并进的,所以从 TDD 的角度来看,您需要保持原样,避免直接调用静态刷新方法;否则很难正确进行单元测试。

    【讨论】:

    • 事实上,静态类/方法被认为是一种反模式,因此如果您想要一个真正的 DDD 实现,您可能需要重新考虑如何刷新帐户。
    • 如果我取出“静态”关键字怎么办?在确定调用什么方面会有所不同吗? (即直接来自服务或方法)
    • @Dan,声称static 类/方法是反模式是错误的(那么您将如何定义 C# 扩展方法)?更准确的说法是,当人们不了解其代码的真实生命周期或结构时,静态类和方法更容易被滥用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多