单例服务可以使用(作用域)的dbContext吗?

时间:2018-11-25 08:54:14

标签: c# asp.net-core dependency-injection asp.net-core-2.0

我需要保留从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保留在内存中。

1 个答案:

答案 0 :(得分:1)

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