2012-04-04 17 views
1

私はリポジトリの概念を初めて使い、いくつかの質問をします。私はMVCアプリケーションで簡単なリポジトリクラスを作成しました。私のコントローラでIRepositoryのコンセプト、指定されたリポジトリを作成する場所

public interface IRepository<TEntity> where TEntity : class 
    { 
     List<TEntity> FetchAll(); 
     IQueryable<TEntity> Query { get; } 
     void Add(TEntity entity); 
     void Delete(TEntity entity); 
     void Save(); 
    } 

    public class SqlRepository<T> : IRepository<T> where T : class 
    { 
     readonly DataContext _db; 
     public SqlRepository(DataContext db) 
     { 
      _db = db; 
     } 

     #region IRepository<T> Members 

     public IQueryable<T> Query 
     { 
      get { return _db.GetTable<T>(); } 
     } 

     public List<T> FetchAll() 
     { 
      return Query.ToList(); 
     } 

     public void Add(T entity) 
     { 
      _db.GetTable<T>().InsertOnSubmit(entity); 
     } 

     public void Delete(T entity) 
     { 
      _db.GetTable<T>().DeleteOnSubmit(entity); 
     } 

     public void Save() 
     { 
      _db.SubmitChanges(); 
     } 

     #endregion 
    } 

私はこの

public class AdminController : Controller 
    { 

     private readonly SqlRepository<User> _userRepository = new SqlRepository<User>(new DataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString())); 
     private readonly SqlRepository<Order> _orderRepository = new SqlRepository<Order>(new DataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()));   

//Skip code 
} 

などの指定されたテーブルクラスのリポジトリクラスを初期化するしかし、私は私のアプリの多くの場所で何度も何度もこのコードを複製します。これらのリポジトリクラスをインスタンス化するのに最適な場所は何ですか?

+0

工場を使用してください... – mshsayem

+0

これを行うSqlRepositoryにパラメータの少ないコンストラクタを作成してみませんか? – Peter

答えて

4

私はあなたが、それはインターフェースだ経由でリポジトリに参照すべきだと思う:

​​

そして、いくつかの依存性注入フレームワークを経由して実装を注入。

UPDATE

あなたのコントローラに依存性の注入のためのNinjectを使用することができます。ここにExampleあなたのアプリケーションにDependencyResolverを追加する方法です。あなたの場合、カーネルをこのように設定することができます:

IKernel kernel = new StandardKernel(); 
var connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
kernel.Bind(typeof(DataContext)).ToMethod(context => new DataContext(connectionString)); 
kernel.Bind(typeof(IRepository<>)).To(typeof(SqlRepository<>)); 

これだけです。重複はありません。依存関係は解決されました。クラスは具体的なリポジトリに依存しません。依存関係を簡単にテストしてテストすることができます。

+0

なぜインターフェイス経由で参照する必要があるのか​​説明できますか? – Tomas

+1

これらの依存関係を注入することを強くお勧めします。各コントローラーが独自のリポジトリーを作成すると、単一のリポジトリー(キャッシングなど)を持つことによる利点がすべて失われます。 –

+2

@トーマスの場合、インターフェイス(抽象化)に対してコードを記述するのは可能な限り試してください。そうすれば、アプリケーションは特定の実装に結合されません。後で、xmlファイルをストレージとして使用したり、ストレージを増やしたりすることに変更し、その変更がアプリケーションの残りの部分に影響しないようにすることもできます。別の使用法は、テストのためのものです。レポをモックするか、偽のレポ実装を使用するように、レポを使用してコントローラやコードをテストする方が簡単です – MikeSW

関連する問題