DDD Enity 持久性方案

本文关键字:方案 持久性 Enity DDD | 更新日期: 2023-09-27 18:35:07

我正在尝试找出保留域更改的最佳位置。我有以下实体:

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);

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

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

有什么想法吗?谢谢

DDD Enity 持久性方案

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

正如 Jack Hughes 所说,实体不应该依赖于它们的存储库。另外,我不明白为什么您需要"服务"来获得您的贸易实体?这是存储库的责任。也不确定为什么要将对交易对象的引用传递给 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);
        }
    }