UI/コントローラー/サービスでEntity Frameworkを直接使用しているという前提に基づいて、質問に答えます。
EF を含む任意の ORM を UI/コントローラー/サービスで直接使用すると、将来多くの問題が発生することが証明されています。その上、不可能ではないにしても、アプリケーションの単体テストが非常に難しくなります。
モデルとリポジトリには異なる責任があり、SOLID原則の「単一の責任」の部分に基づいているため、2つの概念を一緒にマージしないでください。モデルで Active Objects パターンを使用したい場合でも (これはお勧めしません)、使用する ORM からモデルを分離する必要があります。
最善かつ最も推奨される解決策は、パターンが示すように、非常に基本的なメンバーを持つ IRepository または IRepository のようなインターフェイスを持つことです。何かのようなもの:
Interface IRepository<T> where T:class
{
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
// if you don't want to return IQueryable
T FindById(object id);
IEnumerable FindXXXXX(params)
// if you prefer to return an IQueryable
IQueryable<T> Find(Expression<Func<T, bool>> predeicate);
}
一部の人々は、リポジトリが IQueryable を返すべきではないと信じていることに注意してください。さらに、式とラムダの代わりに ISpecification を使用することを検討できます。
ほとんどのエンティティに IRepositoy インターフェイスを実装する必要があります。このアプローチを使用すると、単体テストを作成するときにリポジトリをモックすることもできます。運用環境では、Unity、Ninject、Linfu、Catsle などの Ioc プロバイダーを使用する必要があります。特定の IoC フレームワークへの結合を回避するために、Microsoft の共通サービス ロケーターの実装を利用することもできます。
昔は、特定のビジネス ドメインやサービス用に実装されたデータ アクセス インターフェイスがありました。このアプローチの問題点の 1 つは、ソース コードを追跡すると、異なるデータ アクセス サービスでコードが重複してしまうことです。