【发布时间】: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