如何在启动时使用 dotnet core 3 中的依赖项调用自定义服务?
How to call a custom service at startup with dependencies in dotnet core 3?
我创建了一个 dotnet 核心 MVC 应用程序。当应用程序第一次启动时,我想从数据库加载一些数据到内存缓存中。
我知道如何使用 IMemoryCache,在其中填充数据并获取它们。
但是,当应用程序启动时,我想用数据库中的数据填充内存缓存。所以我创建了一个名为 ReferenceCache 的单例和接口 IReferenceCache。
public interface IReferenceCache
{
public void Setup(IMemoryCache cache);
}
public class ReferenceCache : IReferenceCache
{
private ILogger<ReferenceCache> _logger;
private IMemoryCache _cache;
public void Setup(IMemoryCache cache)
{
//_logger = logger;
_cache = cache;
using (var context = new UtpmvContext())
{
var references = context.Reference.ToList();
_cache.Set("reference", references);
}
}
public List<Reference> GetSomeData()
{
var lsReferences = _cache.Get<List<Reference>>("reference");
List<Reference> liste = lsReferences.FindAll(x => x.ReferenceId == "ANY_ID");
return liste;
}
}
在 ConfigureServices 中我添加了我的单例:
services.AddSingleton<IReferenceCache, ReferenceCache>();
然后在启动文件的Configure部分,我在签名中添加了IReferenceCache和IMemoryCache,调用我的设置class。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IReferenceCache cache, IMemoryCache memoryCache)
{
// ... code removed for clarity
// I call my service to load the data in the in-memory
cache.Setup(memoryCache);
}
这个东西在我的 ReferenceCache class 中,我希望能够记录...那么如何添加 ILogger 的依赖项?
我以前从未在 dotnet core 中创建过任何服务,所以如果我的设计不正确,请告诉我。
感谢您的帮助! :)
您可以使用传递给 AddSingleton
方法的 IServiceProvider
解析 ILogger<T>
:
services.AddSingleton<IReferenceCache>(serviceProvider =>
new ReferenceCache(serviceProvider.GetRequiredService<ILogger<IReferenceCache>>()));
以上注册替换ConfigureServices
中的services.AddSingleton<IReferenceCache, ReferenceCache>()
。
您可以像解析 ILogger<IReferenceCache>
一样解析 IMemoryCache
,即使用 IServiceProvider
的 GetRequiredService
方法。
顺便说一下,这已记录在案 here。
我创建了一个 dotnet 核心 MVC 应用程序。当应用程序第一次启动时,我想从数据库加载一些数据到内存缓存中。
我知道如何使用 IMemoryCache,在其中填充数据并获取它们。 但是,当应用程序启动时,我想用数据库中的数据填充内存缓存。所以我创建了一个名为 ReferenceCache 的单例和接口 IReferenceCache。
public interface IReferenceCache
{
public void Setup(IMemoryCache cache);
}
public class ReferenceCache : IReferenceCache
{
private ILogger<ReferenceCache> _logger;
private IMemoryCache _cache;
public void Setup(IMemoryCache cache)
{
//_logger = logger;
_cache = cache;
using (var context = new UtpmvContext())
{
var references = context.Reference.ToList();
_cache.Set("reference", references);
}
}
public List<Reference> GetSomeData()
{
var lsReferences = _cache.Get<List<Reference>>("reference");
List<Reference> liste = lsReferences.FindAll(x => x.ReferenceId == "ANY_ID");
return liste;
}
}
在 ConfigureServices 中我添加了我的单例:
services.AddSingleton<IReferenceCache, ReferenceCache>();
然后在启动文件的Configure部分,我在签名中添加了IReferenceCache和IMemoryCache,调用我的设置class。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IReferenceCache cache, IMemoryCache memoryCache)
{
// ... code removed for clarity
// I call my service to load the data in the in-memory
cache.Setup(memoryCache);
}
这个东西在我的 ReferenceCache class 中,我希望能够记录...那么如何添加 ILogger 的依赖项?
我以前从未在 dotnet core 中创建过任何服务,所以如果我的设计不正确,请告诉我。
感谢您的帮助! :)
您可以使用传递给 AddSingleton
方法的 IServiceProvider
解析 ILogger<T>
:
services.AddSingleton<IReferenceCache>(serviceProvider =>
new ReferenceCache(serviceProvider.GetRequiredService<ILogger<IReferenceCache>>()));
以上注册替换ConfigureServices
中的services.AddSingleton<IReferenceCache, ReferenceCache>()
。
您可以像解析 ILogger<IReferenceCache>
一样解析 IMemoryCache
,即使用 IServiceProvider
的 GetRequiredService
方法。
顺便说一下,这已记录在案 here。