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

问题描述 投票:0回答:1

我创建了一个dotnet core MVC应用程序。当应用程序第一次启动时,我想从数据库中加载一些数据到内存缓存中,我知道如何使用IMemoryCache,在里面填充数据并获取它们。

我知道如何使用IMemoryCache,在里面填充数据和获取数据,但是,当应用程序启动时,我想用数据库中的数据填充内存缓存。所以我创建了一个名为ReferenceCache的Singleton和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中,我添加了我的singleton。

services.AddSingleton<IReferenceCache, ReferenceCache>();

然后在启动文件的Configure部分,我在签名中添加了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);
    }

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

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

谢谢你的帮助 :)

c# .net .net-core dependency-injection asp.net-core-3.1
1个回答
0
投票

你可以解决 ILogger<T> 使用 IServiceProvider 传到 AddSingleton 方法。

services.AddSingleton<IReferenceCache>(serviceProvider => 
    new ReferenceCache(serviceProvider.GetRequiredService<ILogger<IReferenceCache>>()));

上述登记取代了 services.AddSingleton<IReferenceCache, ReferenceCache>()ConfigureServices.

你可以解决 IMemoryCache 同理 ILogger<IReferenceCache>即使用 GetRequiredService 的方法 IServiceProvider.

这一点有文件记载。此处 顺便说一句,

© www.soinside.com 2019 - 2024. All rights reserved.