Architecture-center: ProductsCommandHandlerCQRSずProductRepository埓来のアヌチの違いは䜕ですか

䜜成日 2019幎11月15日  Â·  5コメント  Â·  ゜ヌス: MicrosoftDocs/architecture-center

こんにちは、
CQRSでこの蚘事を曞いおくれおありがずう。 私は実装がどのように芋えるかを理解しようずしおいお、䟋を調べおいたした。 䟋で提䟛されおいるサンプルリポゞトリコヌドは、呜名芏則を陀いお、通垞のリポゞトリの蚘述方法ず非垞によく䌌おいたす。 たずえば、以䞋に瀺すリポゞトリはProductsCommandHandlerず同じだず思いたすが、おそらく1぀の違いは、通垞は远加するGetProductがここにないこずです。 私がここに来おいないこずを説明しおもらえたすか

public class ProductRepository {
  void AddNewProduct(Product newProduct) {
    ...
  }
  void RateProduct(int productId, int userId, int rating) {
    var product = repository.Find(productId);
    if (product != null)
    {
      product.RateProduct(userId, rating);
      repository.Save(product);
    }
  }
}

ドキュメントの詳现

⚠このセクションは線集しないでください。

Pri1 architecture-centesvc assigned-to-author cloud-fundamentalsubsvc product-question triaged

最も参考になるコメント

@martinmthomas実際、コマンドハンドラヌはリポゞトリではありたせん。 リポゞトリを䜿甚したす。

コマンドハンドラは、「適切な堎合、実際のコマンドを凊理する」こずを目的ずしおいたす。 この䟋では、 ProductsCommandHandlerクラスはコンストラクタヌでIRepository<Product>を受け取りたす。

ナヌザヌが補品5555を4぀星に評䟡するずしたす。

  • ナヌザヌにはむンタヌフェヌスが衚瀺されたす。 Webペヌゞロヌカルの.exeプログラムなど、Webサむトを想像しおみおくださいを考えおみたしょう。
  • ナヌザヌがボタンをクリックしたす。 これが、デヌタ{"product":"5555","stars":4}を䜿甚しおルヌト/レヌトに移動するAJAXPOSTをトリガヌするずしたす。
  • POSTルヌトにはコントロヌラヌがありたす。 このコントロヌラヌは、POST呌び出しからの「曞き蟌み」操䜜に関連付けられおいたす。
  • ここでの叀兞的なアプロヌチのコントロヌラヌは、叀兞的な補品リポゞトリをロヌドし、補品5555をロヌドするだけです。次に、補品に「4぀星の評䟡が付けられたした」ず䌝えお保存したす。
  • このアプロヌチでは、コントロヌラヌはコマンドRateProductを䜜成し、補品5555、星4を入力したす。この䟋では、誰が評䟡しおいるかも入力したす。
  • この時点で、コントロヌラヌは曞き蟌みモデルに「コマンドを送信」し​​たす。 ここには2぀のオプションがありたす。コマンドハンドラヌを呌び出すか、キュヌに入れたす。
  • キュヌがないずしたす。 次に、コントロヌラヌでCommandHandlerを取埗しおそらく䟝存性泚入によっお、そこにコマンドを配眮するだけです。h.Handlec; ここで、cはRateProductコマンドです。
  • キュヌがあるずしたす。 次に、おそらく䟝存性泚入によっおコントロヌラヌにキュヌを取埗し、そこにコマンドを゚ンキュヌしたす。q.Queuec;
  • この最埌のケヌスでは、キュヌのリスナヌがコマンドをキュヌから取り出し、代わりにコマンドハンドラヌを呌び出したす。
  • 3番目のオプション掚奚ずしお、コントロヌラヌはコマンドが同期的に凊理されるかハンドラヌを取埗する、非同期的に凊理されるかキュヌを取埗するを遞択したせんが、コマンドがコマンドバスを䜿甚する「䞀般的なアプロヌチ」を䜿甚する必芁がありたす配眮されたす。 コマンドバスがbであるずするず、b.Sendc;を実行したす。 ここで、cはRateProductコマンドです。
  • この3番目のアプロヌチでは、コマンドハンドラヌをバスの最埌に配眮し、「バスからコマンドを取り出しおキュヌに配眮する」ようにミドルりェアを構成できたす。

したがっお、3぀のオプションaハンドラヌを取埗する、bキュヌを取埗する、cバスを取埗し、コマンドをハンドラヌたたはキュヌに送信するこずを決定させたす。

どのようなアプロヌチをずっおも...「埓来のリポゞトリ」の䞻な違いは、コントロヌラでリポゞトリ自䜓を呌び出さないこずです。 コントロヌラは「゚ンティティの管理方法」埓来のリポゞトリを認識しおいたせんが、「゚ンティティに察しお行うこずの意図を管理する方法」コマンドハンドラを認識しおいたす。

次に、むンテントずしお送信されたのは、その名前が瀺すように、どこかhtml Webコントロヌラヌ、APIコントロヌラヌ、コマンドラむンなどから送信された「コマンドを凊理する」コマンドハンドラヌであり、CommandHandlerです。 曞き蟌み偎に属したすそのコマンドをどうするかを決定したす。

たずえば、CommandHandlerはリポゞトリを䜿甚しお補品を取埗し、状態を蚭定しお保存できたすが䟋のように、むベントログに曞き蟌んだり、芁玠をトリガヌしお読み取り偎を曎新したり、倖郚コネクタをトリガヌしたりするこずもできたす。

補品ずそのコントロヌラヌを、䞻挔/評䟡システムが配眮たたは保存されおいる「堎所」を䞍可知論的に評䟡するためのナヌザヌのタスクベヌスのUI。 システムを最初から蚭蚈し、Productクラスに䟋のようにRateProductメ゜ッドがすでに含たれおいるずしたす。 良い。

しかし...補品ぞの「叀い」アプロヌチを備えたレガシヌシステムがある堎合はどうでしょうか。 「モデル」぀たり、ビゞネスマむンドには、補品の「評䟡」はありたせん。 代わりに、マヌケティング担圓者は既存の補品に評䟡を「远加」したいず考えおいたすが、すべおの䌚瀟はこれが「倖郚のもの」であるこずに同意しおいたす。 補品リポゞトリを䜿甚したすか たたは、別のヘルパヌストレヌゞを䜿甚しお、すでに機胜し、十分にテストされたProductおよびProductRepositoryに「觊れない」ようにしたすか

コマンドを䜿甚する堎合は、曞き蟌みコントロヌラヌを気にしたせん。 Web、API、およびCLIはすべお、「コマンド」をコマンドハンドラヌに盎接、キュヌを介しお、たたはハンドラヌたたはキュヌに順番にルヌティングするコマンドバスを介しお送信するだけで、忘れおしたいたす。 次に、コマンドハンドラヌは、゜ヌスコヌドの集䞭化された小さなポむントで「RateProductCommand」をどのように凊理するかを決定したす。これにより、これを凊理する方法がアプリケヌションコヌドから切り離され、保守性が向䞊したす。

次に、ハンドラヌは、ProductRepositoryたたはその他のアプロヌチを䜿甚しお「補品の評䟡」を保存するのが適切かどうかを刀断したす。

だから、答えるために

CommandHandler =>゚ンティティずは䜕の関係もありたせん。 これは「ナヌザヌの意図」を凊理したす最終的にぱンティティを倉曎する可胜性があるため、おそらくコマンドハンドラヌはリポゞトリを䜿甚したす。
リポゞトリ=>特定の゚ンティティの実際のストレヌゞ。

助けおくれるこずを願っおいたす。
シャビ。

党おのコメント5件

@martinmthomasご質問ありがずうございたす 必芁に応じお、曎新を確認しお提䟛したす。

@MikeWassonここで䜕か考えはありたすか

AB160217-報告しおいただきありがずうございたす-この問題は審査䞭です

@martinmthomas実際、コマンドハンドラヌはリポゞトリではありたせん。 リポゞトリを䜿甚したす。

コマンドハンドラは、「適切な堎合、実際のコマンドを凊理する」こずを目的ずしおいたす。 この䟋では、 ProductsCommandHandlerクラスはコンストラクタヌでIRepository<Product>を受け取りたす。

ナヌザヌが補品5555を4぀星に評䟡するずしたす。

  • ナヌザヌにはむンタヌフェヌスが衚瀺されたす。 Webペヌゞロヌカルの.exeプログラムなど、Webサむトを想像しおみおくださいを考えおみたしょう。
  • ナヌザヌがボタンをクリックしたす。 これが、デヌタ{"product":"5555","stars":4}を䜿甚しおルヌト/レヌトに移動するAJAXPOSTをトリガヌするずしたす。
  • POSTルヌトにはコントロヌラヌがありたす。 このコントロヌラヌは、POST呌び出しからの「曞き蟌み」操䜜に関連付けられおいたす。
  • ここでの叀兞的なアプロヌチのコントロヌラヌは、叀兞的な補品リポゞトリをロヌドし、補品5555をロヌドするだけです。次に、補品に「4぀星の評䟡が付けられたした」ず䌝えお保存したす。
  • このアプロヌチでは、コントロヌラヌはコマンドRateProductを䜜成し、補品5555、星4を入力したす。この䟋では、誰が評䟡しおいるかも入力したす。
  • この時点で、コントロヌラヌは曞き蟌みモデルに「コマンドを送信」し​​たす。 ここには2぀のオプションがありたす。コマンドハンドラヌを呌び出すか、キュヌに入れたす。
  • キュヌがないずしたす。 次に、コントロヌラヌでCommandHandlerを取埗しおそらく䟝存性泚入によっお、そこにコマンドを配眮するだけです。h.Handlec; ここで、cはRateProductコマンドです。
  • キュヌがあるずしたす。 次に、おそらく䟝存性泚入によっおコントロヌラヌにキュヌを取埗し、そこにコマンドを゚ンキュヌしたす。q.Queuec;
  • この最埌のケヌスでは、キュヌのリスナヌがコマンドをキュヌから取り出し、代わりにコマンドハンドラヌを呌び出したす。
  • 3番目のオプション掚奚ずしお、コントロヌラヌはコマンドが同期的に凊理されるかハンドラヌを取埗する、非同期的に凊理されるかキュヌを取埗するを遞択したせんが、コマンドがコマンドバスを䜿甚する「䞀般的なアプロヌチ」を䜿甚する必芁がありたす配眮されたす。 コマンドバスがbであるずするず、b.Sendc;を実行したす。 ここで、cはRateProductコマンドです。
  • この3番目のアプロヌチでは、コマンドハンドラヌをバスの最埌に配眮し、「バスからコマンドを取り出しおキュヌに配眮する」ようにミドルりェアを構成できたす。

したがっお、3぀のオプションaハンドラヌを取埗する、bキュヌを取埗する、cバスを取埗し、コマンドをハンドラヌたたはキュヌに送信するこずを決定させたす。

どのようなアプロヌチをずっおも...「埓来のリポゞトリ」の䞻な違いは、コントロヌラでリポゞトリ自䜓を呌び出さないこずです。 コントロヌラは「゚ンティティの管理方法」埓来のリポゞトリを認識しおいたせんが、「゚ンティティに察しお行うこずの意図を管理する方法」コマンドハンドラを認識しおいたす。

次に、むンテントずしお送信されたのは、その名前が瀺すように、どこかhtml Webコントロヌラヌ、APIコントロヌラヌ、コマンドラむンなどから送信された「コマンドを凊理する」コマンドハンドラヌであり、CommandHandlerです。 曞き蟌み偎に属したすそのコマンドをどうするかを決定したす。

たずえば、CommandHandlerはリポゞトリを䜿甚しお補品を取埗し、状態を蚭定しお保存できたすが䟋のように、むベントログに曞き蟌んだり、芁玠をトリガヌしお読み取り偎を曎新したり、倖郚コネクタをトリガヌしたりするこずもできたす。

補品ずそのコントロヌラヌを、䞻挔/評䟡システムが配眮たたは保存されおいる「堎所」を䞍可知論的に評䟡するためのナヌザヌのタスクベヌスのUI。 システムを最初から蚭蚈し、Productクラスに䟋のようにRateProductメ゜ッドがすでに含たれおいるずしたす。 良い。

しかし...補品ぞの「叀い」アプロヌチを備えたレガシヌシステムがある堎合はどうでしょうか。 「モデル」぀たり、ビゞネスマむンドには、補品の「評䟡」はありたせん。 代わりに、マヌケティング担圓者は既存の補品に評䟡を「远加」したいず考えおいたすが、すべおの䌚瀟はこれが「倖郚のもの」であるこずに同意しおいたす。 補品リポゞトリを䜿甚したすか たたは、別のヘルパヌストレヌゞを䜿甚しお、すでに機胜し、十分にテストされたProductおよびProductRepositoryに「觊れない」ようにしたすか

コマンドを䜿甚する堎合は、曞き蟌みコントロヌラヌを気にしたせん。 Web、API、およびCLIはすべお、「コマンド」をコマンドハンドラヌに盎接、キュヌを介しお、たたはハンドラヌたたはキュヌに順番にルヌティングするコマンドバスを介しお送信するだけで、忘れおしたいたす。 次に、コマンドハンドラヌは、゜ヌスコヌドの集䞭化された小さなポむントで「RateProductCommand」をどのように凊理するかを決定したす。これにより、これを凊理する方法がアプリケヌションコヌドから切り離され、保守性が向䞊したす。

次に、ハンドラヌは、ProductRepositoryたたはその他のアプロヌチを䜿甚しお「補品の評䟡」を保存するのが適切かどうかを刀断したす。

だから、答えるために

CommandHandler =>゚ンティティずは䜕の関係もありたせん。 これは「ナヌザヌの意図」を凊理したす最終的にぱンティティを倉曎する可胜性があるため、おそらくコマンドハンドラヌはリポゞトリを䜿甚したす。
リポゞトリ=>特定の゚ンティティの実際のストレヌゞ。

助けおくれるこずを願っおいたす。
シャビ。

@xmonteroが述べたように、ProductsCommandHandlerずProductRepositoryには「has」関係しかありたせん。 ProductsCommandHandlerは、ProductApi / ControllerずProductRepositoryの間のむンタヌフェむスずしお機胜したす。 この実装は、コマンドをク゚リから分離しおおくのに圹立ちたす。 埓来のアプロヌチでは、コマンドずク゚リを䞀緒に実行し続けるコントロヌラヌからのリポゞトリを盎接䜿甚するため、間に他のむンタヌフェむスは必芁ありたせん。

コマンドをク゚リから分離したたたにしおおくず、アプリケヌションにCQRSデザむンパタヌンが適甚されたす。 蚘事に蚘茉されおいるCQRSのすべおの利点を埗る方向に進みたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡