首页 > 解决方案 > 单例服务可以使用(作用域)dbContext 吗?

问题描述

我需要保留从 Db 获得的几个值,并且在会话期间保持不变,尽管它们可能会由于用户发送特定请求而改变。我们曾经使用 Session 变量来做到这一点。

我想注册一个 Singleton 服务,它将从 Db 中获取一些值并在整个会话期间保留它们。所以该服务需要我的 DbContext。

界面很简单:

interface IPhrases
{
    Task SetPhrasesForLanguage(int LanguageID);
}

服务类与此类似:

public class LangPhrases : IPhrases
{
    private OVContext _context;
    private int _LanguageID;
    public string PageHeading { get; set; }

    public LangPhrases(OVContext context, int LanguageID)
    {
        _context = context;
        _LanguageID = LanguageID;
    }

    public Task SetPhrasesForLanguage(int LanguageID)
    {
        IQueryable<clsPhrases> lPhrases = (from p in _context.Phrases
                   where p.LangaugeId == LanguageID
                   select new clsPhrases()
                   {
                       Phrase=p.Phrase,
                       VarID=p.VarId
                   });
        //logic to get PageHeading from the lPhrases collection
    }
}

将作用域 DbContext 传递给单例服务是否会在请求之间将 DbContext 保留在内存中?

澄清一下:我正在寻找一种方法来获取这些值并将它们保留在会话中,而不将 DbContext 保留在内存中。

标签: c#asp.net-coredependency-injectionasp.net-core-2.0

解决方案


您应该使用请求范围的服务和IMemoryCache来缓存值。如果在缓存中找不到值,请从 DbContext 中读取它们,它也应该是 Request-Scoped。


推荐阅读