DDD实体持久性方案

时间:2012-05-24 11:28:41

标签: c# domain-driven-design

我正在努力锻炼保持域名更改的最佳位置。我有以下实体:

public class Period
{
   public Guid PeriodId { get; set; }
   public DateTime StartDate { get; set; }
   public DateTime EndDate { get; set; }
}

Trade
{
   public Guid TradeId { get; set; }
   Trader Instigator { get; set; }
   Trader Acceptor { get; set; }
   Period period { get; set; }
   public long Volume { get; set; }
   public decimal Price { get; set; }
}

现在创建一个新的交易我已将其卸载到域服务

tradeService.PlaceTrade(Guid periodId, Guid UserId, decimal price. long volume)

地点交易功能似乎很适合上述域名服务,交易服务仍然存在。我传入一个ITradeRepository类来实现。

接受交易我想拥有以下内容,以便交易的域逻辑位于交易实体内。

Trade trade = tradeRepository.Get(Guid tradeId)

TradeStatus = trade.Accept(userId);

上述问题是Trade实体负责持久化数据,因此依赖于ITradeRepository。

这是正确的做法吗?感觉很脏吗?或者更好的方法是为交易类创建一个扩展方法,以便为接受交易提供相同的功能?

有什么想法? 感谢

2 个答案:

答案 0 :(得分:3)

实体不应该知道有关存储库的任何信息。所以交易应该接受用户ID并设置其内部状态以反映它。但随后服务或控制器应该将交易添加或保存到存储库。将交易保存到存储库然后一次性持有实体(可能还有许多交易聚合的子实体)。

答案 1 :(得分:3)

正如杰克休斯所说,实体不应该依赖他们的存储库。此外,我不明白为什么你需要一个服务'获得您的贸易实体?这是存储库的责任。还不确定为什么要将交易对象的引用传递给get方法?

这就是我编码的方式:

   //This is an application service method    
    public void AcceptTrade(Guid tradeId, Guid acceptingTraderId)
    {
        using (IUnitOfWork unitOfWork = UnitOfWorkFactory.Create())
        {
            Trade trade = _tradeRepository.GetById(tradeId);
            Trader acceptingTrader = _traderRepository.GetById(acceptingTraderId);

            trade.Accept(acceptingTrader);

            _tradeRepository.Save(trade);
        }
    }