首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IRepository概念,在何处创建指定的存储库

IRepository概念,在何处创建指定的存储库
EN

Stack Overflow用户
提问于 2012-04-04 15:57:28
回答 1查看 925关注 0票数 1

我是存储库概念的新手,并得到了一些问题。我已经在我的MVC应用程序中创建了简单的存储库类。

代码语言:javascript
运行
复制
   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
    }

在我的控制器中,我为指定的表类初始化存储库类,如下所示

代码语言:javascript
运行
复制
 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
}

但我在我的应用程序中的许多地方一次又一次地重复这段代码。哪里是实例化这些存储库类的最佳位置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-04 16:01:31

我认为你应该通过它的接口来引用仓库:

代码语言:javascript
运行
复制
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添加到您的应用程序中。在你的例子中,你可以这样配置内核:

代码语言:javascript
运行
复制
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<>));

就是这样。没有重复。依赖关系已解决。您的类不依赖于具体的存储库。您可以轻松地模拟依赖项进行测试。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10007043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档