2

I CQRS シン読み取りレイヤーを使用して、非正規化リスト/レポート データを UI に提供します。

アプリケーションの一部で、ユーザーがデータをフィルタリングできるように検索ボックスを提供したいと考えています。

Lucene.NET は、以前に実装したことがあり、非常に満足しているため、現在選択している全文検索エンジンです。

しかし、検索側は CQRS のどこに適合するのでしょうか?

2 つのオプションが表示されますが、おそらくもっと多くのオプションがあります。

1] 私のコントローラーは、検索文字列を検索レイヤー (Lucene.NET) に渡すことができます。検索レイヤーは、CQRS 読み取りレイヤーに渡すことができる ID のリストを返します。読み取りレイヤーはこれらの ID を受け取り、それらを WHERE ID IN (1,2,3) 句にまとめて、最終的に DataTable または IEnumerable をコントローラーに返します。

List<int> ids = searchLayer.SearchCustomers("searchString");
result = readLayer.GetCustomers(ids);

2]私の薄い読み取りレイヤーには、コード化された検索を直接含めることができるので、呼び出すだけです

readLayer.GetListOfCustomers("search string", page, page1);
4

2 に答える 2

1

CQRS を使用しても、アプリケーションのすべての部分で使用するわけではないことに注意してください。アプリケーションを小さなコンポーネントに分割すると、さまざまなアーキテクチャの原則とパターンを適切に使用できます。全文検索 API は、これらのコンポーネントの 1 つかもしれません。

于 2013-06-27T15:20:44.867 に答える
0

アプリケーションのすべての詳細を知らなくても、コントローラーから検索レイヤーへの単一のエントリ ポイント (上記のオプション #2) に傾倒します。あなたのコントローラーは、フルテキスト対応の検索にはレイヤー #1 を呼び出し、通常のWHERE句タイプの検索にはレイヤー #2 を呼び出す必要があることを認識すべきではないと思います。

2 つの異なる「コンテキスト」(例:SQLContextLuceneContext) があり、これらは に注入された依存関係であると想定しますReadLayerLuceneContext次に、読み取りレイヤーのロジックで、いつ使用するか、いつ使用するかを決定する必要がありますSQLContext。あなたのコントローラーは知らないし、知らないはずです。

これにより、将来、やむを得ない理由がある場合に、コントローラーが認識したり変更したりすることなくLuceneContext交換することもできます。MongoContext

また、すべてにインターフェイスを使用する場合 (たとえば、 andISearchContextによって実装されている場合)、コンテキストを交換するための実際の変更は、IoC コンテナーの初期化/ルールだけです。LuceneContextMongoContext

したがって、オプション #2 を使用して、依存関係を挿入し、コントローラーを読み取りレイヤーで動作させるだけで、準備完了です。うまくいけば、これが役に立ちます!

于 2013-06-27T13:22:04.057 に答える