2

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

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。

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

有什么想法吗?谢谢

4

2 回答 2

3

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

于 2012-05-24T11:38:18.703 回答
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);
        }
    }
于 2012-05-25T10:09:08.103 回答