C# 如何在MVC应用程序中保持存储库活动

C# 如何在MVC应用程序中保持存储库活动,c#,asp.net-mvc,entity-framework,repository-pattern,C#,Asp.net Mvc,Entity Framework,Repository Pattern,您好,我正在寻找一种在整个应用程序生命周期中保持存储库初始化的方法。目前,我正在初始化每个控制器上的每个存储库。因此,它总是在每个新控制器上访问数据库,如果结果集很大,这会减慢应用程序的速度 public Controller() : this(new someRepository() { ........... } public Controller(IRepository IRepository , ) {

您好,我正在寻找一种在整个应用程序生命周期中保持存储库初始化的方法。目前,我正在初始化每个控制器上的每个存储库。因此,它总是在每个新控制器上访问数据库,如果结果集很大,这会减慢应用程序的速度

    public Controller()
        : this(new someRepository()
    {
        ...........
    }

    public Controller(IRepository IRepository , )
    {
        ....
    }
我没有使用依赖项注入,但是一些示例代码或指向站点的方向会很有用


谢谢

一个好的策略是使用缓存。看看System.Web.Caching.Cache。第一次获取数据时,可以将其写入缓存,并在连续读取时从缓存中检索数据(假设数据未更改)。

一个好的策略是使用缓存。看看System.Web.Caching.Cache。第一次获取数据时,您可以将其写入缓存,并在连续读取时从缓存中检索数据(假设数据未更改)。

您可以创建一个存储存储库实例的
静态变量

public class SomeRepository
{
   private static SomeRepository _instance;
   public static SomeRepository Instance
   {
       get 
       {
           return _instance ?? (_instance = new SomeRepository());
       }
   }
}
然后像这样使用它:

public Controller()
        : this(SomeRepository.Instance)
    {
        ...........
    }

    public Controller(IRepository IRepository , )
    {
        ....
    }

您可以创建一个存储存储库实例的
静态
变量

public class SomeRepository
{
   private static SomeRepository _instance;
   public static SomeRepository Instance
   {
       get 
       {
           return _instance ?? (_instance = new SomeRepository());
       }
   }
}
然后像这样使用它:

public Controller()
        : this(SomeRepository.Instance)
    {
        ...........
    }

    public Controller(IRepository IRepository , )
    {
        ....
    }


这听起来不错,但我想我将无法在非web应用程序项目中使用缓存。。由于“我的存储库”位于类库项目中,您应该缓存repo调用返回的结果。repo本身不应该知道或关心结果是否被缓存。我同意这一点,我认为应该是这样的,但是我如何通过参数将缓存对象传递到非控制器类中呢?这可能吗?+1。注意缓存结果比在ASP.Net应用程序中使任何内容都保持静态要好得多,特别是潜在的非线程安全类,如存储库的简单实现。@user3428422-不确定“通过参数传递缓存对象”有什么问题。。。如果您需要支持ASP.Net和console/WPF/WinForms项目,请使用一些接口抽象缓存,并包装这两个
Cache
类来实现您的接口。这听起来不错,但我想我无法在非web应用程序项目中使用缓存。。由于“我的存储库”位于类库项目中,您应该缓存repo调用返回的结果。repo本身不应该知道或关心结果是否被缓存。我同意这一点,我认为应该是这样的,但是我如何通过参数将缓存对象传递到非控制器类中呢?这可能吗?+1。注意缓存结果比在ASP.Net应用程序中使任何内容都保持静态要好得多,特别是潜在的非线程安全类,如存储库的简单实现。@user3428422-不确定“通过参数传递缓存对象”有什么问题。。。如果您需要支持ASP.Net和console/WPF/WinForms项目,请使用一些接口抽象缓存,并包装这两个
Cache
类以实现您的接口。因此,基本上将存储库类设置为静态类?@user3428422否,您可以将存储库的实例存储在静态变量中。查看编辑后的答案以获取示例。好的,这是有意义的,但是当我获取数据时,存储库方法是界面中的合同,因此我无法使用Static@user3428422您不需要将任何方法设置为静态,您必须将存储库的实例存储在一个静态字段中,并从那里访问它,而不是每次都创建一个实例。+0:static(或应用程序生命周期的任何其他形式)在ASP.Net等多线程上下文中通常是有问题的-在执行此路径之前,请确保您的对象是线程安全的。注意:如果您使用依赖项注入容器(如Unity、ninject,…),那么它可能会通过允许注册object/singleton的实例来替代
static
。因此,基本上将存储库类设置为静态类?@user3428422否,您可以将存储库的实例存储在静态变量中。查看编辑后的答案以获取示例。好的,这是有意义的,但是当我获取数据时,存储库方法是界面中的合同,因此我无法使用Static@user3428422您不需要将任何方法设置为静态,您必须将存储库的实例存储在一个静态字段中,并从那里访问它,而不是每次都创建一个实例。+0:static(或应用程序生命周期的任何其他形式)在ASP.Net等多线程上下文中通常是有问题的-在执行此路径之前,请确保您的对象是线程安全的。注意:如果您使用依赖项注入容器(如Unity、ninject,…),那么它可能会通过允许注册object/singleton的实例来替代
静态
。请确保不要在请求之间共享相同的实体框架上下文。虽然旧,但其他读者可能会感兴趣。通常认为使用静态对象(作为真实静态对象或依赖项注入单例对象)是不好的,尤其是对于EntityFramework之类的ORM框架,如果上下文保持活动时间过长(过长=比实际请求长),则会导致严重的减速。也就是说,您的存储库构造函数不应该执行任何繁重或耗时的任务,并且应该能够非常快速地实例化存储库。请确保不要在请求之间共享相同的实体框架上下文。虽然它很旧,但其他读者可能会感兴趣。通常认为使用静态对象(作为真实静态对象或依赖项注入单例对象)是不好的,尤其是对于EntityFramework之类的ORM框架,如果上下文保持活动时间过长(过长=比实际请求长),则会导致严重的减速。也就是说,您的存储库构造函数不应该执行任何繁重或耗时的任务,并且应该非常快地实例化存储库