c# - IRepository 概念,在何处创建指定的存储库

标签 c# asp.net-mvc-3 repository

我是 Repository 概念的新手,遇到了一些问题。我在我的 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
    }

在我的 Controller 中,我像这样为指定的表类初始化存储库类

 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
}

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

最佳答案

我认为您应该通过它的界面引用存储库:

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
}

并通过一些依赖注入(inject)框架注入(inject)实现。

更新

您可以使用 Ninject用于对 Controller 的依赖注入(inject)。这是 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<>));

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

关于c# - IRepository 概念,在何处创建指定的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10007043/

相关文章:

javascript - Ajax.ActionLink AjaxOptions 回调问题 (ASP.NET MVC 3)

c# - ASP.Net C# 如何使网站上的页面在通过登录进行身份验证后可访问

ubuntu - 您如何使用一个 Ubuntu 机器作为另一个机器的软件包存储库?

c# - 如何从非 UI 线程获取 UI SynchronizationContext 并且没有表单或 UI 创建的任何对象

c# - 如何在 C# 中执行保持 ALT+TAB sendkey 事件

c# - 在C#中排序列表

java - 如何使用 EGIT 读取公共(public) git 存储库的所有提交?

c# - 使用非托管导出将字符串从C#返回C++会返回数字

asp.net-mvc - RouteValueDictionary 初始化和 MapRoute 问题

iphone - 我的 Cydia 存储库出现问题