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

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);
        }
    }
于 2012-05-25T10:09:08.103 に答える
3

エンティティはリポジトリについて何も知らないはずです。したがって、取引はユーザー ID を受け入れ、それを反映するように内部状態を設定する必要があります。ただし、サービスまたはコントローラーは、取引をリポジトリに追加または保存する必要があります。取引をリポジトリに保存すると、エンティティ (および、集計を取引する多くのサブエンティティ) が一度に永続化されます。

于 2012-05-24T11:38:18.703 に答える