首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDD Enity持久化场景

DDD Enity持久化场景
EN

Stack Overflow用户
提问于 2012-05-24 19:28:41
回答 2查看 124关注 0票数 2

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

代码语言:javascript
复制
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; }
}

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

代码语言:javascript
复制
tradeService.PlaceTrade(Guid periodId, Guid UserId, decimal price. long volume)

place交易功能似乎很适合上面的域服务,交易服务持久化交易。为了方便起见,我传入了一个ITradeRepository类。

要接受交易,我希望具有以下内容,以便交易的域逻辑位于交易实体中。

代码语言:javascript
复制
Trade trade = tradeRepository.Get(Guid tradeId)

TradeStatus = trade.Accept(userId);

上面的问题是,交易实体负责持久化数据,因此依赖于ITradeRepository。

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

有什么想法吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-24 19:38:19

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-25 18:09:08

正如Jack Hughes所说,实体不应该依赖于它们的存储库。另外,我不明白为什么你需要一个“服务”来获得你的交易实体?这是存储库的责任。也不确定为什么要将对交易对象的引用传递给get方法?

下面是我编写代码的方式:

代码语言:javascript
复制
   //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);
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10736590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档