单例服务可以使用(范围内的)dbContext 吗?
Can a singleton service use the (scoped) dbContext?
我需要保留从 Db 获得的几个值,并且在会话期间将保持不变,尽管它们可能会因用户发送特定请求而发生变化。我们过去常常使用会话变量来做到这一点。
我想注册一个 Singleton 服务,它将从 Db 获取一些值并在整个会话期间保留它们。所以该服务需要我的 DbContext。
界面简单:
interface IPhrases
{
Task SetPhrasesForLanguage(int LanguageID);
}
服务class与此类似:
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 保留在内存中。
您应该使用 Request-Scoped 服务和 IMemoryCache 来缓存值。如果您没有在缓存中找到这些值,请从 DbContext 中读取它们,它也应该是 Request-Scoped。
我需要保留从 Db 获得的几个值,并且在会话期间将保持不变,尽管它们可能会因用户发送特定请求而发生变化。我们过去常常使用会话变量来做到这一点。
我想注册一个 Singleton 服务,它将从 Db 获取一些值并在整个会话期间保留它们。所以该服务需要我的 DbContext。
界面简单:
interface IPhrases
{
Task SetPhrasesForLanguage(int LanguageID);
}
服务class与此类似:
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 保留在内存中。
您应该使用 Request-Scoped 服务和 IMemoryCache 来缓存值。如果您没有在缓存中找到这些值,请从 DbContext 中读取它们,它也应该是 Request-Scoped。