我正在努力锻炼保持域名更改的最佳位置。我有以下实体:
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。
这是正确的做法吗?感觉很脏吗?或者更好的方法是为交易类创建一个扩展方法,以便为接受交易提供相同的功能?
有什么想法? 感谢
答案 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);
}
}