【问题标题】:Can a singleton service use the (scoped) dbContext?单例服务可以使用(作用域)dbContext 吗?
【发布时间】:2019-04-27 04:55:52
【问题描述】:

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

【问题讨论】:

  • Will passing the scoped DbContext to a singleton service keep the DbContext in memory between requests? 提供给单例的作用域 DbContext 将超出请求之间的作用域,这很糟糕。下次调用 SetPhrasesForLanguage 时,由于已释放上下文,它将失败。
  • 这变成了XY problem。我们需要在这里看到更大的图景才能为您提供适当的建议。
  • 您能否再澄清一下“会话”是什么?
  • 一个单例服务将被所有用户共享,因此您将无法使用它来缓存数据,除非该服务能够处理多个用户。如果您想通过单个用户的请求来保留数据,那么session state 可能是要走的路。由于这会将数据移出您的服务实例,因此您可以将其设置为范围甚至是瞬态的。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多