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

Posted

技术标签:

【中文标题】如何在启动时使用 dotnet core 3 中的依赖项调用自定义服务?【英文标题】:How to call a custom service at startup with dependencies in dotnet core 3? 【发布时间】:2020-09-23 14:03:01 【问题描述】:

我创建了一个 dotnet core MVC 应用程序。当应用程序第一次启动时,我想将一些数据从数据库加载到内存缓存中。

我知道如何使用 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 中我添加了我的单例:

services.AddSingleton<IReferenceCache, ReferenceCache>();

然后在启动文件的配置部分,我在签名中添加了 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 中创建过任何服务,所以如果我的设计不正确,请告诉我。

感谢您的帮助! :)

【问题讨论】:

【参考方案1】:

您可以使用传递给AddSingleton 方法的IServiceProvider 解析ILogger&lt;T&gt;

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

以上注册替换了ConfigureServices中的services.AddSingleton&lt;IReferenceCache, ReferenceCache&gt;()

您可以像解析ILogger&lt;IReferenceCache&gt; 一样解析IMemoryCache,即使用IServiceProviderGetRequiredService 方法。

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

【讨论】:

非常感谢您的精彩回答!这正是我一直在寻找的。 :)

以上是关于如何在启动时使用 dotnet core 3 中的依赖项调用自定义服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 dotnet core 3 控制台应用程序中更改时重新加载“appsettings.json”

Dotnet 在 Mac ASP.NET Core 3 上意外退出

细说.net core Startup

如何强制降级 dotnet core 中的传递依赖

Dotnet Core 3.1:如何将 AddJsonFile 与文件的绝对路径一起使用?

提供静态图像文件时的 Dotnet Core 3.1 cors 问题