ORMがLINQ、Eager Loadingなどの柔軟性を提供する場合、余分なレイヤーの後ろにORMを隠しません。
raw sql(micro ORM)が関係する場合は、とにかく「クエリごとのメソッド」を使用して再利用性を実現し、リポジトリパターンを適切に適合させる必要があります。
What do you do if you want to switch out ORMs?
You would have ORM specific code in your application if you do not contain it in a repository.
なぜ切り替える必要があるのですか?
必要な機能のほとんどを備えたものを使用する必要があります。ormXの新しいリリースが新しい機能をもたらし、現在の機能よりも優れていることが判明する可能性がありますが、...
ormを非表示にすることを選択した場合、すべての候補者が共通して持つ機能のみを使用できます。
たとえばDictionary<string, Entity>
、ormYはプロパティを処理できないため、エンティティでプロパティを使用できません。
LINQと仮定すると、ORMスイッチの大半は、単にライブラリの参照を切り替えると交換され、使用されているsession.Query<Foo>()
とcontext.Foos
、それがコンパイルされるまでまたは類似。退屈なタスクですが、抽象化レイヤーをコーディングするよりも時間がかかりません。
Is the repository pattern still valid when not using an ORM and you are using ADO.NET for data access and populating object data yourself?
はい。コードは再利用可能である必要があります。つまり、SQLの構築、オブジェクトの実体化などを1つの場所(別個のクラス)に配置する必要があります。クラスを「XRepository」と呼び、そこからインターフェースを抽出することもできます。
If you use an ORM but not the repository pattern where do you keep commonly used queries?
Would it be wise to represent each query as a class and have some sort of query factory to create instances?
LINQが使用されていると仮定すると、クラスラッパーはやり過ぎです。より良い方法は拡張メソッドです
public static IQueryable<T> Published<T>(this IQueryable<T> source) where T : Page
{
// at some point someone is going to forget to check that status
// so it makes sense to extract this thing
return source.Where(x => x.Status == Status.Published && x.PublishTime <= DateTime.UtcNow);
}
複数の場所で使用されている(またはその可能性がある)コードが十分に複雑(エラーが発生しやすい)な場合は、中央の場所に抽出する必要があります。