C# 如何在第一次请求时从数据库加载一些数据,但防止其他调用(同时)在.NET中也这样做?
我有一个类,它作为一个单例在依赖项注入中注册,因此只有一个实例/这个类的同一个实例被注入到我的MVC控制器中 在这个类中,我有一个方法可以做到这一点:C# 如何在第一次请求时从数据库加载一些数据,但防止其他调用(同时)在.NET中也这样做?,c#,.net,lazy-loading,lazy-evaluation,lazy-initialization,C#,.net,Lazy Loading,Lazy Evaluation,Lazy Initialization,我有一个类,它作为一个单例在依赖项注入中注册,因此只有一个实例/这个类的同一个实例被注入到我的MVC控制器中 在这个类中,我有一个方法可以做到这一点: 仅在第一次调用此方法时将数据从文件/数据库加载到RAM中。e、 g.所有国家的名字,或电影中所有人的名字,等等 现在对RAM中的数据集合执行一些非常简单的文本查询 这里的要点是,我只需要加载一次数据。这是我的代码,顺便说一句 public string Foo(ISession dbSession) { LoadDataFromFil
- 仅在第一次调用此方法时将数据从文件/数据库加载到RAM中。e、 g.所有国家的名字,或电影中所有人的名字,等等
- 现在对RAM中的数据集合执行一些非常简单的文本查询
public string Foo(ISession dbSession)
{
LoadDataFromFileOrDbOrWherever();
return GetAnswer(_data);
}
你明白了。其要点是该方法必须提供当前数据库会话。这就是我的致命之处:(我正在考虑使用Lazy
并在构造函数中执行此操作……但是我需要将ISession传递到构造函数中,而我实际上还没有这样做
那么,人们在这里的常见模式是什么,只在第一次通话中获取一些数据,记住……然后从现在开始引用它
如果同时发出两个或三个调用,我希望第二个/3个/etc调用阻塞/等待,直到第一个调用完成数据加载过程
起初我想到了双重检查锁定……但现在这是一种有点反模式的模式,因为.NET有一个很好的Lazy
类
有什么想法吗,善良的人们?您可以使用它来执行您想要的方法一次,并在您再次调用它时提供缓存结果
using LazyCache;
IAppCache cache = new CachingService();
return await cache.GetOrAddAsync<ILoadChartStorageInformation[]>
(key, (Func<Task<ILoadChartStorageInformation[]>>) (async () =>
{
return await someFunction();
}
使用LazyCache;
IAppCache cache=new CachingService();
return wait cache.GetOrAddAsync
(键,(Func)(异步()=>
{
return wait someFunction();
}
请参阅LazyCache文档以获取更详细的文档:
这听起来是使用Task和async的理想场所。先进行InitAsync,然后所有其他操作都会等待它完成。我记得创建者曾讨论过类似的问题。找到了