1

次のドメイン エンティティがあります。

public class CartItem
{
    public virtual Guid Id { get; set; }
    public virtual Guid SessionId  { get; set; }
    public virtual int Quantity  { get; set; }
    public virtual Product Product  { get; set; }
}

私は次のDTOを持っています:

public class CartItemDTO
{
    public CartItemDTO(CartItem cartItem)
    {
        Id = cartItem.Id;
        Quantity = cartItem.Quantity;
        Name = cartItem.Product.Name;
        Price = cartItem.Product.Price;
    }

    public Guid Id { get; private set; }
    public int Quantity { get; private set; }
    public string Name { get; private set; }
    public decimal Price { get; private set; }
}

現在のワークフローは非常に単純です。私のリポジトリは CartItem 型の IEnumerable を返します。私のサービスはそれを dto (CartItemDTO) に変換します。私のコントローラーはそれをビューに渡します。ここまでは順調ですね。

ここで、各項目の合計を実装したいと考えています。次のプロパティを CartItemDTO に追加しました。

public decimal Total { get; private set; }

次に、次のコードを CartItemDTO コンストラクターに追加しました。

Total = cartItem.Quantity * cartItem.Product.Price;

私の最初の質問は、これがベスト プラクティスのアプローチであるかどうかです。そうでない場合、なぜですか?Total プロパティを別の場所に追加する必要がありましたか? もしそうなら、なぜですか?

また、カート全体の合計を実装したかったので、新しいクラス (以下) を作成し、それを返すようにサービスを変更しました。

public class CartItemResult
{
    public CartItemResult(IEnumerable<CartItemDTO> result)
    {
        CartItems = new List<CartItemDTO>(result);
        Total = result.Sum(total => total.Total);
    }

    public IList<CartItemDTO> CartItems { get; private set; }
    public decimal Total { get; private set; }
}

これで、新しいクラスをビューに渡すか、別の ViewModel を作成して新しいクラスのコンテンツを ViewModel に渡し、それをビューに渡すことができます。

2 番目の質問は、このアプローチがベスト プラクティスのアプローチであるかどうかです。そうでない場合、なぜ、何を別の方法で行う必要があったのでしょうか?

4

2 に答える 2

5

DTO は、データを転送するための純粋なクラスです。ロジックを含めないでください。ドメイン駆動設計タグを追加したので、ドメイン オブジェクトとドメイン サービスを使用したいと思います。アイテムの合計を計算するのは、ドメイン オブジェクト (CartItem) の役割です。ドメイン オブジェクトは、データ + ビジネス ロジックとそのデータを操作するルールです。合計の計算はビジネス ロジックです。また、2 番目の部分 (CartItemResult) についても、これは通常、ドメイン サービスと呼ばれるものによって処理されます。ドメイン サービスは、単一のドメイン オブジェクトに関連するのではなく、多くのドメイン オブジェクトと連携するビジネス ロジックを提供します。

ただし、プロジェクトの複雑さも考慮する必要があります。これは本当に必要ですか?存在するという理由だけでパターンを使用しないでください。常に使用する理由を見つけてください。David Neale が言及したアプローチも、一部のアプリケーションでは正しいものです。

よろしく、ラディスラフ

于 2010-08-09T21:56:10.937 に答える
3

個人的には、データを取得するために、リポジトリから POCO エンティティを返し、それをコントローラー ( Automapper ) の ViewModel にマッピングすることをお勧めします。実際に中間オブジェクトを持つ必要はありません。

Totalプロパティを実装する場所は設計次第です。そのプロパティは、ビジネス ロジックのドメインで使用されていますか? それは可能性が?そうでない場合は、単にプレゼンテーションの問題であり、ViewModel に適していると考えることができます。

データ更新の場合 - CartItemUpdateViewModelUI で のようなものを返しますCartItemUpdateDetails。これは、コントローラーのドメイン エンティティにマップされ、リポジトリ メソッドに渡されます。

あなたの質問に関する限りCartItemResult。私は個人的にTotalロジックをViewModelに入れ、そのViewModelをリポジトリメソッドからcontrrlerに入力しますIEnumerable<CartItem>.

DDD を紹介する優れたエンタープライズ アプリケーションについては、WhoCanHelpMeプロジェクトをご覧ください。

于 2010-08-09T11:31:19.590 に答える