Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IRepository概念,用于创建指定存储库的位置_C#_Asp.net Mvc 3_Repository - Fatal编程技术网

C# IRepository概念,用于创建指定存储库的位置

C# IRepository概念,用于创建指定存储库的位置,c#,asp.net-mvc-3,repository,C#,Asp.net Mvc 3,Repository,我不熟悉存储库的概念,并有一些问题。我在MVC应用程序中创建了简单的存储库类 public interface IRepository<TEntity> where TEntity : class { List<TEntity> FetchAll(); IQueryable<TEntity> Query { get; } void Add(TEntity entity); void

我不熟悉存储库的概念,并有一些问题。我在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
    }
公共接口假定,其中tenty:class
{
List FetchAll();
IQueryable查询{get;}
无效添加(潜在实体);
无效删除(潜在实体);
作废保存();
}
公共类SqlRepository:IRepository,其中T:class
{
只读数据上下文_db;
公共SqlRepository(DataContext数据库)
{
_db=db;
}
#地区成员
公共可查询查询
{
获取{return _db.GetTable();}
}
公共列表FetchAll()
{
返回Query.ToList();
}
公共无效添加(T实体)
{
_db.GetTable().InsertOnSubmit(实体);
}
公共作废删除(T实体)
{
_db.GetTable().DeleteOnSubmit(实体);
}
公共作废保存()
{
_db.SubmitChanges();
}
#端区
}
在我的控制器中,我为指定的表类初始化存储库类,如下所示

 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
}
公共类AdminController:控制器
{
私有只读SqlRepository _userRepository=新的SqlRepository(新的数据上下文(ConfigurationManager.ConnectionString[“ConnectionString”].ToString());
私有只读SqlRepository _orderRepository=新SqlRepository(新数据上下文(ConfigurationManager.ConnectionString[“ConnectionString”].ToString());
//跳过代码
}

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

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

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
}
公共类AdminController:控制器
{
私有只读IRepository用户存储库;
私有只读IRepository\u orderRepository;
公共AdminController(IRepository userRepository,
IRepository orderRepository(存储库)
{
_userRepository=userRepository;
_orderRepository=orderRepository;
}
//跳过代码
}
并通过依赖注入框架注入实现

更新

您可以使用将依赖项注入控制器。下面是如何将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<>));
IKernel内核=新的标准内核();
var connectionString=ConfigurationManager.connectionString[“connectionString”]。connectionString;
Bind(typeof(DataContext)).ToMethod(context=>newdatacontext(connectionString));
Bind(typeof(IRepository)).To(typeof(SqlRepository));

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

我认为您应该通过存储库的界面来参考存储库:

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
}
公共类AdminController:控制器
{
私有只读IRepository用户存储库;
私有只读IRepository\u orderRepository;
公共AdminController(IRepository userRepository,
IRepository orderRepository(存储库)
{
_userRepository=userRepository;
_orderRepository=orderRepository;
}
//跳过代码
}
并通过依赖注入框架注入实现

更新

您可以使用将依赖项注入控制器。下面是如何将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<>));
IKernel内核=新的标准内核();
var connectionString=ConfigurationManager.connectionString[“connectionString”]。connectionString;
Bind(typeof(DataContext)).ToMethod(context=>newdatacontext(connectionString));
Bind(typeof(IRepository)).To(typeof(SqlRepository));

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

为什么不在SqlRepository中创建一个无参数构造函数来完成此操作?为什么不在SqlRepository中创建一个无参数构造函数来完成此操作?您能解释一下我为什么要通过接口引用吗?强烈建议注入这些依赖项。如果每个控制器都创建了自己的存储库,那么您就失去了拥有单个存储库(缓存等)的所有优势。@Tomas,您应该尽可能针对接口(抽象)进行编码,因为这样,应用程序就不会耦合到特定的实现。稍后,您可能希望切换到使用xml文件作为存储,甚至使用clould存储,并且希望更改不会影响应用程序的其余部分。另一个用法是,您可以进行测试。使用repo测试控制器或任何代码更容易,因为您可以模拟repo或使用伪repo实现。您能解释一下为什么我应该通过接口引用吗?强烈建议注入这些依赖项。如果每个控制器都创建了自己的存储库,那么您就失去了拥有单个存储库(缓存等)的所有优势。@Tomas,您应该尽可能针对接口(抽象)进行编码,因为这样,应用程序就不会耦合到特定的实现。稍后,您可能希望切换到使用xml文件作为存储,甚至使用clould存储,并且希望更改不会影响应用程序的其余部分。另一个用法是,您可以进行测试。使用repo测试控制器或任何代码都更容易,因为您可以模拟repo或使用伪repo实现