在启动时运行cachewarmer

时间:2016-10-21 09:55:45

标签: asp.net-core

我有一个ASP.NET Core MVC应用程序,并在服务容器中有一个CacheWarmerService。目前我只使用内存缓存,但我需要在应用程序启动时运行它。

但是,我对如何做到这一点表示怀疑。我的CacheWarmerService有一些需要在构造函数中注入的服务。我可以从Startup.cs类中做到这一点,或者应该放在哪里?

每次启动时都需要运行。

3 个答案:

答案 0 :(得分:8)

您还可以创建自己的漂亮而干净的扩展方法,例如app.UseCacheWarmer(),然后您可以从Startup.Configure()拨打电话:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ... logging, exceptions, etc

    app.UseCacheWarmer();

    app.UseStaticFiles();
    app.UseMvc();
}

在该方法中,您可以使用app.ApplicationServices访问DI容器(IServiceProvider)并获取所需服务的实例。

public static class CacheWarmerExtensions
{
    public static void UseCacheWarmer(this IApplicationBuilder app)
    {
        var cacheWarmer = app.ApplicationServices.GetRequiredService<CacheWarmerService>();
        cacheWarmer.WarmCache();
    }
}

答案 1 :(得分:6)

您可以使用Configure Startup方法注入您的服务(以及任何其他服务)。

此方法中唯一必需的参数是IApplicationBuilder,如果已在ConfigureServices配置了DI,则会从DI中注入任何其他参数。

public void Configure(IApplicationBuilder app, CacheWarmerService cache)
{
    cache.Initialize();  // or whatever you call it

    ...

    app.UseMvc();
}

答案 2 :(得分:1)

如果有人使用Daniels方法,并且在cachewarm服务内部使用诸如EF数据上下文之类的范围服务,则会出现以下错误。

'Cannot resolve 'ICacheWarmerService' from root provider because it requires scoped service 'dbContext'.'

为此,您可以创建范围并使用缓存的方法。

public static void UseCacheWarmer(this IApplicationBuilder app)
{
    using (var serviceScope = app.ApplicationServices.CreateScope())
    {
        var cacheWarmer = serviceScope.ServiceProvider.GetService<ICacheWarmerService>();
        cacheWarmer.WarmCache();
     }

     //// var cacheWarmer = app.ApplicationServices.GetRequiredService<ICacheWarmerService>();
     //// cacheWarmer.WarmCache();
}