如何在启动时调用具有 dotnet core 3 依赖项的自定义服务?

Tri*_*tan 5 .net c# dependency-injection .net-core asp.net-core-3.1

我创建了一个 dotnet core 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在ConfigureServices中我添加了我的单例:

services.AddSingleton<IReferenceCache, ReferenceCache>();
Run Code Online (Sandbox Code Playgroud)

然后在启动文件的配置部分中,我在签名中添加了 IReferenceCache 和 IMemoryCache 并调用我的安装类。

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);
    }
Run Code Online (Sandbox Code Playgroud)

问题是在我的 ReferenceCache 类中,我希望能够记录...那么如何添加 ILogger 的依赖项?

我以前从未在 dotnet core 中创建过任何服务,所以如果我的设计不正确,请告诉我。

感谢您的帮助!:)

mm8*_*mm8 4

您可以ILogger<T>使用IServiceProvider传递给该AddSingleton方法的 来解析:

services.AddSingleton<IReferenceCache>(serviceProvider => 
    new ReferenceCache(serviceProvider.GetRequiredService<ILogger<IReferenceCache>>()));
Run Code Online (Sandbox Code Playgroud)

上述注册替换services.AddSingleton<IReferenceCache, ReferenceCache>()ConfigureServices.

您可以IMemoryCache像您解决的那样解决ILogger<IReferenceCache>,即使用GetRequiredService的方法IServiceProvider

顺便说一句,这已记录在此处。