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。
这是正确的做法吗?感觉很脏?或者更好的方法是为交易类创建一个扩展方法,以促进接受交易的相同功能?
有什么想法吗?谢谢
实体不应该知道有关存储库的任何信息。因此,交易应该接受用户 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);
}
}