【问题标题】:Aggregate root Domain Logic聚合根域逻辑
【发布时间】:2011-10-31 15:31:52
【问题描述】:

假设我在下面有这 3 个类:

public class User 
{
   public int UserId { get; set; }
   public ICollection<Location> { get; set; }
}
public class Location
{
   public int LocationId { get; set; }
   public int UserId { get; set; }
   public ICollection<Sale> Sales { get; set; }
}
public class Sale
{
  public int SaleId { get; set; }
  public int LocationId { get; set; }
  public decimal Cash { get; set; }
}

我需要在单个页面上显示登录用户的所有位置的总现金。我正在考虑将 GetTotalCash() 方法放在 Locations 类上并实现通过 LINQ 进行求和,但问题是我将通过 User 类访问 Locations 对象,并且我将无法调用求和方法,因为 Location 属性是 User 类的 ICollection。我应该把逻辑放在 User 类上吗?但这没有意义,因为它不是 User 对象的行为,还是这样?

顺便说一句,我使用的是 EF 4.1 Code First 和 MVC 3。

非常感谢!

【问题讨论】:

    标签: c# asp.net-mvc-3 entity-framework-4.1 domain-driven-design


    【解决方案1】:

    在locations类中实现GetTotalCash()方法,在用户类中实现GetCashForLocation()以获取选定位置的现金(这会将调用委托给locations类的GetTotalCash(),并实现GetTotalCash()在用户类中,它将迭代所有位置并将它们的现金相加。

    然后根据信息专家类分配谴责并从聚合根委派

    【讨论】:

    • “然后每个信息专家类都分配了reprehensibilites,并从聚合根中委派”。这是什么意思?
    • 另外,GetCashForLocation 似乎应该属于存储库?
    • Information Expert 是 GRASP 模式之一en.wikipedia.org/wiki/GRASP_(object-oriented_design) 这些模式描述了您应该在哪里设计方法以及如何分配职责。
    • 关于 GetCashForLocation .. 如果用户已完全加载其所有位置和销售额,则无需再次从存储库中获取这些信息,因为它已加载到用户中,如果未加载则存储库是正确的地方
    • 感谢您的链接。至于所有位置的加载,我使用的是 EF,它会自动加载相关实体,因为启用了延迟加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多