如何在第一个请求时从数据库加载一些数据,但防止其他调用(同时)在 .NET 中也这样做?



我有一个类,它在我的依赖注入中注册为单例 - 所以只有一个实例/这个类的相同实例被注入到我的MVC控制器中。

在本课程中,我有一个方法可以做到这一点:

  • 仅在第一次调用此方法时将数据从文件/数据库加载到RAM中。 例如,所有国家/地区的名称,或电影中的所有人等等。
  • 现在对RAM中的此数据集合进行一些非常简单的文本查询。

所以这里的重点是我只需要加载一次数据。顺便说一句,这是我的代码。

public string Foo(ISession dbSession)
{
LoadDataFromFileOrDbOrWherever();
return GetAnswer(_data);
}

你明白了。这样做的要点是 METHOD 必须提供当前数据库会话。这就是杀死我的原因:(我正在考虑使用Lazy<IList<MyData>>并在构造函数中执行此操作......但是我需要将ISession传递到构造函数中,而我实际上还没有。

那么人们在这里做的常见模式是什么,只在第一次调用时获取一些数据,记住那个......然后引用它,从现在开始。

如果同时进行两个或三个调用,我预计第二个/第三个/等调用 BLOCK/WAIT 直到第一个调用完成数据加载过程。

最初我想到了双重检查锁定...但是现在这是一种反模式,因为.NET具有漂亮的Lazy<T>类。

有什么想法吗,善良的人?

您可以使用LazyCache,它将执行您希望的方法一次,并在您再次调用它时为您提供缓存的结果。

using LazyCache;
IAppCache cache = new CachingService();
return await cache.GetOrAddAsync<ILoadChartStorageInformation[]>
(key, (Func<Task<ILoadChartStorageInformation[]>>) (async () =>
{
return await someFunction();
}

查看 LazyCache 文档以获取更详细的文档: https://github.com/alastairtree/LazyCache

相关内容

  • 没有找到相关文章