如何保持存储库在MVC应用程序存活

问题描述:

嗨我正在寻找一种方法来保持存储库在整个应用程序生命周期中初始化。目前我正在初始化每个控制器上的每个存储库。因此,它总是会在数据库中的每个新的控制器上,如果结果集很大,这减慢我没有使用依赖注入的应用程序下来如何保持存储库在MVC应用程序存活

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

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

,但一些示例代码或一个方向到网站将有用。

谢谢

+1

确保不就结了共享跨请求相同的实体框架上下文。 – usr 2014-11-02 19:30:59

+0

虽然它可能会让其他读者感兴趣。使用静态(或者作为真正的静态或者依赖注入单例对象)通常被认为是不好的,特别是对于ORM框架(比如EntityFramework),并且如果上下文长时间存活(太长=比实际请求更长)会导致严重的减速)。也就是说,你的Repository构造函数不应该做任何繁重或耗时的任务,并且应该非常快速地实例化一个存储库。 – Tseng 2015-10-03 13:22:51

您可以制作一个static变量来存储存储库实例。

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 ,) 
    { 
     .... 
    } 
+0

那么基本上使库类成为静态类? – user3428422 2014-11-02 19:20:54

+0

@ user3428422不,您可以将存储库的一个实例存储在一个静态变量中。查看样本的编辑答案。 – brz 2014-11-02 19:22:26

+0

好了,但我得到我的数据时的存储库方法是一个接口中的合同,所以我不能使用静态 – user3428422 2014-11-02 19:25:51

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

+0

听起来不错,但我想我将无法在非web应用程序项目中使用缓存。因为我的存储库位于类库项目 – user3428422 2014-11-02 19:14:09

+1

中,您应该缓存回购调用返回的结果。回购本身不应该知道或关心结果被缓存。 – 2014-11-02 19:16:17

+0

我同意这一点,这就是我认为它应该是这样的,但我如何通过参数传递缓存对象到非控制器类?这可能吗? – user3428422 2014-11-02 19:18:12