2012-04-04 79 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 2012-04-04 08:01:39

+0

为什么不在你的SqlRepository中创建一个参数少的构造函数呢? – Peter 2012-04-04 08:03:07

回答

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 2012-04-04 08:16:18

+1

强烈建议注入这些依赖项。如果每个控制器都创建它自己的存储库,那么您将丧失具有单个存储库(缓存等)的所有优点。 – 2012-04-04 08:32:21

+2

@Tomas,你应该总是尽可能地对接口(抽象)进行编码,因为这样,应用程序将不会与特定的实现耦合。稍后,您可能希望切换到使用xml文件作为存储或甚至是存储,并且您希望更改不会影响应用程序的其余部分。另一个用法是你进行测试。使用回购测试您的控制器或任何代码更容易,因为您可以模拟回购或使用假回购实施 – MikeSW 2012-04-04 08:39:12