問題タブ [repository-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
677 参照

asp.net-mvc - MVC でデータ コンテキスト (アダプタ、接続、セッションなど) をインスタンス化する場所は?

私たちはASP.NET MVCサイトを構築しています.ユニットテストを最も有効にするために接続を定義する場所に苦労しています.トランザクションとデータベース操作を管理できるデータ コンテキスト)。

3 つのクラスがあるとします。

以前は、UserService のメソッド内で次のようなことを行っていました。

ただし、SomeSession への依存関係が挿入されていないため、これを単体テストすることは実際には不可能でした。ただし、DI を使用して UserService に依存関係を挿入すると、セッションは UserService の存続期間中ハングアップします。UserController から複数のサービスが呼び出された場合、UserController がガベージ コレクションされるまで、それぞれのサービスがハングアップする可能性があります。

これをより適切に管理する方法について何か考えはありますか? 明らかな何かが欠けていますか?

編集

わかりにくかったらすみません。セッション/データ コンテキストで依存性注入を使用できることは理解していますが、サービス クラスの存続期間中は維持されます。実行時間の長いアクション/メソッド (つまり、サービスがバッチ プロセスによって呼び出されているとしましょう) の場合、テスト容易性を追加する以外の理由で、多くのオープン セッションが発生する可能性があります。

0 投票する
2 に答える
750 参照

.net - Linq2Sql - ネストされたリストをどのように遅延読み込みしますか?

実際にクエリを実行せずに、ネストされたリストをどのように遅延ロードしますか? 非常に基本的な例を使用すると、次のようになります。

そして、私のリポジトリレイヤーには、次のメソッドがあります。

次に、Service レイヤーに GetCityBlocksByOwner を配置します。ここで拡張メソッドを使用して、特定の人物が所有する都市ブロックを取得します。たとえば、Guido のブロックが必要だとします。

リポジトリで .ToList() を実行すると、クエリが実行されます。そのレベルで取得しているブロックが誰なのかわからないため、これはばかげています。問題は、これを効率的に行うにはどうすればよいかということです。

50000 のブロック所有者と 1000000 の都市ブロックがあり、それらすべてをロードすることはオプションではないと仮定しましょう。入れ子のため、IQueryables の使用は機能しません (少なくとも私が認識している極端なハッキングがなければ)。また、Rob Conery の LazyList のようなものを使用しようとすると、基本的に DAL からドメイン モデルへのリークが発生し、将来的には非常に悪い結果になる可能性があります。

では、これを正しく行うにはどうすればよいでしょうか。

  • それは正しい文脈を決定することの問題ですか?もしそうなら、これをリポジトリ層で行うか、それともサービス層で行うか?
  • 非常に具体的なサービス メソッドを取得するために、サービス レイヤーとリポジトリ レイヤーを半分融合させますか?
  • それとも、何かが完全に欠けていますか?(とにかく段階的に廃止されているLinq2Sqlのことにはまだ比較的新しいので...)

編集: リポジトリ パターンでは、現在ドメイン オブジェクトにマッピングしているため、次のようになります。

これが機能するには、CityBlock オブジェクトの実際のフィールドを IQueryable にしない限り、建物に .ToList() を取得させる必要があります。 CityBlock.BuildingsOnBlock フィールドにアクセスするすべての人に付与されます。ドメイン オブジェクトへのマッピングは、サービス レイヤーで行う必要があるのでしょうか。

0 投票する
2 に答える
3538 参照

nhibernate - nHibernate とリポジトリ パターンを使用するには、いくつかの方向性が必要です

わかりましたので、私はちょうどnhibernateに入っています(流暢を使用しています)。

私が気に入っている点の 1 つは、Repository パターンを使用できることです (詳細については、nhibernate rhino ブログを参照してください)。

基本的にジェネリックを使用して、すべてのデータベース テーブルで機能するメソッドを作成できます。

次に、Repository クラスを継承し、そのエンティティに固有のメソッドを追加できます。

Update メソッドを追加しようとしたとき、リポジトリ パターンはコレクションに作用するはずだと誰かが言いましたか? ここで物事を間違って見ていますか?update メソッドを作成できないのはなぜですか?

更新メソッドを追加しようとしましたが、セッションを処理してデータベースを更新する方法について混乱していますか?

エンティティごとにすべてのデータベース アクセス用の単一の場所が必要なため、UserRepository にはすべての基本的な CRUD があり、GetUserByEmail() などの他のメソッドが含まれている可能性があります。

0 投票する
3 に答える
1318 参照

design-patterns - リポジトリに含まれるものと含まれないもの

リポジトリ パターンを実装する ASP.NET MVC アプリケーションでは、特定のリポジトリの一般的な焦点にまだ関連している場合、データに関連しないメソッドをリポジトリに配置することが適切かどうかに興味があります。たとえば、ProductImages を追加および削除するためのメソッドを持つ ProductsRepository があるとします。これらの ProductImages は、データベースとローカル ファイル ストアにも部分的に表現されています。ProductImage を削除する必要がある場合は、リポジトリ メソッドを使用してデータベースから行を削除する必要があります。また、そのイメージに関連付けられているファイルをストレージ メディアから削除する必要もあります。IO 操作はリポジトリに属していますか、それともより適切な場所がありますか?

先ほど説明したような状況で私が行っていることの 1 つは、リポジトリに静的メソッドを提供することです。これにより、データベースに保存されているファイル名と事前定義されたディレクトリ パターンを使用して、特定の ProductImage へのパスが提供され、プログラムで生成されます。 . これはリポジトリの使用目的外ですか?


編集

そのような操作がリポジトリに属していない場合、そのような操作は MVC パターンのどこに配置する必要がありますか? 必要に応じてリポジトリを呼び出し、コントローラから静的に呼び出すことができる、コントローラとリポジトリの間に別のレイヤーを配置することは理にかなっているように思えます。

0 投票する
1 に答える
207 参照

linq - IQueryablesを使用したキャッシュ戦略

IQueryablesを最適にキャッシュする方法については、しばらく考えていました。リポジトリパターンを使用して、次のようなクラスにデータをフェッチしています。

では、このオブジェクトをキャッシュするにはどうすればよいでしょうか。実際には、アイテムにリンクできるカテゴリ以外にも多くのものがあるため、クエリ可能での遅延実行を維持したいと思います。オブジェクトが大きくなりすぎる可能性があるため、オブジェクトに格納するためにそれらをフェッチしないことをお勧めします。それらは別々にキャッシュする必要があるかもしれません。

コンパイルされたクエリがこれを何らかの形で可能にする可能性があると私は考えていますが、その方法がよくわかりません。誰かがこれに対する良い解決策を見つけましたか?使用するのはかなり一般的なパターンのようです。

0 投票する
1 に答える
358 参照

c# - Generic Repository Linq2Sql impedence mismatch problem

I am working on a repository pattern where the API look as follows:

#xA;

where visitor is a domain object and x represents this domain object. The method signature of the Find method on the repository is:

#xA;

This is all wonderful until I attempt to use this with Linq2Sql because linq2sql creates its own objects and as a result when I want to call:

#xA;

there is a type mismatch because linq2sql expects a function of the type it created and not the function I am passing in.

0 投票する
4 に答える
1319 参照

c# - DTO (linq2sql) と Class オブジェクトの間の混乱!

私は linq2sql と linq DTO (linq2sql によって作成されたクラス) の操作に成功しています ....

私は混乱しています。古いアプリケーションを更新するタスクがあり、DTO が本来あるべき方法で使用されることがわかります....日付を転送する

私はリポジトリ パターンを使用しているので、linq2sql dtos を介してリポジトリからサービスにデータを渡しています...サービス層に入ったら (これは基本的に私のビジネス ロジックです)、クラス オブジェクトを渡す必要があります。

これらのクラス オブジェクトは、基本的に dtos のミラー イメージ (多かれ少なかれ) です。いくつかの場所でいくつかの変更がありますが、一般的には同じです..

ということで、本題に戻ります!-- リポジトリからサービス層にデータを転送するためだけに dtos を使用するのは、この良い方法ですか...そしてサービス層 (ビジネス ロジック) に入ったら、すべての dtos をクラス オブジェクト カウンター パーツにマッピングする必要があります (もちろん automapper を使用して! !)

私の他の代替手段は、クラスオブジェクトのようなDTOSを引き続き使用し、メソッドからメソッドへ、および戻り値の型などとして渡すことですが、これは悪い習慣だと感じており、どのメソッドを適用すべきか疑問に思っていますか?

どんな助けでも本当に感謝しています

ありがとう

0 投票する
4 に答える
4098 参照

c# - LINQ to SQL INSERT の失敗

LINQ to SQL を使用して新しいレコードを挿入しようとすると、非常にイライラする問題が発生します。このコードをステップ実行すると、新しいレコードが挿入されることがありますが、ほとんどの場合は挿入されません。失敗すると、次のエラーが表示されます。

値 NULL を列 'Name'、テーブル 'EquipmentManufacturer' に挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

このエラーは、「名前」フィールドが null であることを訴えていますが、そうではありません。このコレクションをデバッグしてステップ実行すると、フォームに入力した値が ["Name"] に含まれます。

これがテーブル作成ステートメントです。

これは、新しいレコードを追加しようとしている ASP.NET MVC コントローラーとアクションの作成です。

これが Create.aspx ビューです。

これが私が使用しているリポジトリの実装です。