私はあなたがあなたのUI /コントローラ/サービスに直接Entity Frameworkのを使用しているという仮定に基づいて、あなたの質問に答えます。
EFを含む任意のORMをUI /コントローラ/サービスに直接使用すると、将来的に多くの問題が発生することが証明されています。さらに、不可能ではないにせよ、アプリケーションの単体テストを非常に難しくしています。
モデルとレポジトリは異なる責任を持ち、SOLID原則の「単一責任」の部分に基づいて、2つの概念を併合してはならないため、「モデル実装リポジトリ」も間違っています。あなたのモデルでアクティブオブジェクトパターンを使用することをお勧めしますが、使用している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);
}
一部のポープルbeleiveリポジトリはIQueryableを返すべきではないことに注意してください。さらに、式とラムダの代わりにISpecificationを使用することもできます。
ほとんどのエンティティに対してIRepositoyインターフェイスを実装する必要があります。この方法を使用すると、単体テストを書くときにリポジトリをモックすることもできます。本番環境では、Unity、Ninject、Linfu、CatsleなどのIocプロバイダを使用する必要があります。特定のIoCフレームワークへの結合を避けるために、Microsoftの一般的なサービスロケータの実装を利用することもできます。
私は以前、特定のビジネスドメインまたはサービスに対してインプリメントされたデータアクセスインターフェイスを使用していました。このアプローチの問題の1つは、ソースコードを把握していれば、最終的には別のデータアクセスサービスでコードが重複してしまうことです。
少し混乱するので、質問のタイトルを変更することをお勧めします。タイトルは、Entity Frameworkの使用方法と代替案(つまり、使用しない方法)についての全体的な説明です。 –
は実際にはありません。 私はEFを正確に使用する方法を取得しようとしています。 私はEFのための代替手段が必要ないことを意味します。私は、EFに基づいたさまざまなパターンを使用するための単なる可能な方法が必要です。 – bug0r