2016-04-29 15 views
0

私はDDDを立ち上げようとしていますが、私の場合ASP.Netにテクノロジースタックによって課される制限があるようです一緒に。たとえばのは、私がのShoppingCartの豊富なクラスを作成しているし、私のShoppingCartのAddItemメソッド(文字列SKU)RemoveItem(文字列SKU)の2つのメソッドを持っているとしましょう。今私は、これらの2つの方法で多くの論理を持っているかもしれません。ASP.Netで豊富なドメインモデルをバインドする方法MVC

ASP.Net MVCを使用してShoppingCartをUIにバインドするとどうなりますか?理想的には、ユーザがUIのアイテムを追加または削除するときにAddItemとRemoveItemメソッドを呼び出すといいですが、通常はUIをView Model(POCOクラス)にバインドします。したがって、ユーザーがUIからカートを保存するとき、私は実際のビジネスオブジェクトにマップする必要があるPOCOクラスのリストを取得します。各項目を繰り返し、既存のデータからそれを追跡し、AddItemRemoveItemメソッドを今すぐ呼び出す必要がありますか?

この場合、操作を実行できるように、そのドメインオブジェクトのインスタンスをそのユーザーのメモリに保持する必要があります。それでも、ビジネスオブジェクトを呼び出すメソッドを決定するためにコントローラのロジックを大量に用意しています。

さらに、これらの行を考えてみると、Winformsと呼ばれる問題が発生しないため、より混乱します.Wordformsでは、さまざまなイベントからDomainオブジェクトのそれぞれのメソッドを簡単に呼び出すことができます。

DDDのような仕事をするために、この写真全体には何が欠けていますか?

+0

Winformsでも、ドメインエンティティは永遠にメモリには残らないでしょう。彼らは必要な時にDBからロードされ、ある時点では永続化され、ガベージコレクトされることが望まれます。 – guillaume31

答えて

1

通常、リソースの追加と削除は、http POSTコールになります。したがって、この呼び出しを処理するコントローラ上のメソッドは、アイテムをカートに追加または削除する要求のモデルを受け取ります。たとえば、次のようになります。

public class AddItemToCartRequest 
{ 
    public string CartId { get; set; } 
    public string ItemId { get; set; } 
} 


public class SomeController : Controller 
{ 
    // Reference to some sort of repository/data store for shopping carts 
    private Carts carts; 

    // Reference to some sort of repository/data store for store items. 
    private Items items; 

    public SomeController(Carts carts, Items items) 
    { 
     this.carts = carts; 
     this.items = items; 
    } 

    [HttpPost] 
    public ActionResult AddItem(AddItemToCartRequest request) 
    { 
     var cart = carts.GetCart(request.CartId); 
     var item = items.GetItem(request.ItemId); 

     cart.AddItem(item); 
     carts.Save(cart); 

     // Redirect to action showing the "item added" or whatever. 
    } 
} 

リッチドメインモデルをビューに前後に渡さないという考えがあります。使用しているビューとリクエストのモデルであるクラスを渡します。リクエストごとに、リポジトリ/データストア(例ではカートとアイテムフィールド)からドメインモデルインスタンスを取得します。要求データは、フェッチするドメインモデルインスタンスの識別子を指定するだけでよい。

+0

はい、私はこの部分を理解していますが、これを達成するためには、元のリッチ・ドメイン・モデルをメモリまたはビューの状態またはセッションのどこかに入れて、これらの操作を実行する必要があります。それはまさに私の質問ですが、これはDDDとASP.Net MVCでやることの正しい方法ですか? –

+1

リクエストごとにデータストア/リポジトリからカートとアイテムを取得します。これは、carts.GetCart(request.CartId)コールによって示されているものです。 – lenkan

+0

ありがとうございます!あなたの答えは私の心からの混乱を取り除いた。 –

関連する問題