1

私はリポジトリの概念に不慣れで、いくつか質問があります。MVCアプリで単純なリポジトリクラスを作成しました。

   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
}

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

4

1 に答える 1

4

私はあなたがそのインターフェースを介してリポジトリを参照するべきだと思います:

public class AdminController : Controller
{
   private readonly IRepository<User> _userRepository;
   private readonly IRepository<Order> _orderRepository;

   public AdminController(IRepository<User> userRepository, 
                          IRepository<Order> orderRepository)
   {
       _userRepository = userRepository;
       _orderRepository = orderRepository;
   }
   //Skip code
}

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

アップデート

Ninjectを使用して、コントローラーへの依存性注入を行うことができます。アプリケーションに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<>));

以上です。重複はありません。依存関係は解決されます。あなたのクラスは具体的なリポジトリに依存していません。テストのために依存関係を簡単にモックできます。

于 2012-04-04T08:01:31.033 に答える