2016-10-21 19 views
3

私はASP.NET Core MVCアプリケーションを持っており、サービスコンテナにCacheWarmerServiceを持っています。現在、メモリ内のキャッシュを使用していますが、アプリケーションの起動時に実行する必要があります。起動時にcachewarmerを実行する

しかし、私はそれを行う方法に疑問があります。私のCacheWarmerServiceには、コンストラクタに注入する必要があるサービスがいくつかあります。 Startup.csクラスからこれを行うことはできますか?これはどこに配置する必要がありますか?

起動するたびに実行する必要があります。

+0

あなたのサービスはデータベースのもの( 'DbContext')とHttpContextの権利を必要とすると思いますか? – Tseng

答えて

5

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

    app.UseCacheWarmer(); 

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

そのメソッド内で使用すると、DIコンテナにアクセスするためにapp.ApplicationServicesを使用することができます( IServiceProvider)、必要なサービスのインスタンスを取得します。

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

両方の答えがうまくいきますが、スタートアップファイルをきれいに保つので、このアプローチが本当に好きです。 – Elias

+1

'Use'パターンは一般に、サービスを初期化するのではなく、要求パイプラインにミドルウェアを追加することに関連しています。 – Brad

+0

あなたのアプリでは、ミドルウェアだけである 'app.UseXYZ()'コンベンションについて厳格にしたいならば、 'app.InitCache()'のような別の名前をいつでも見つけることができます。ポイントは拡張メソッドを持っているので、どのWebアプリケーションにもキャッシュサービスを追加するのは可能な限り簡単です。 –

3

StartupConfigureメソッドでサービス(および他のサービス)を注入することができます。

このメソッドで唯一必要なパラメータはIApplicationBuilderです。ConfigureServicesに設定されている場合、他のパラメータはDIから注入されます。

また、あなたはその後、 Startup.Configure()から呼び出すことができます app.UseCacheWarmer()のようなあなた自身のきれい拡張メソッド作成することができ
public void Configure(IApplicationBuilder app, CacheWarmerService cache) 
{ 
    cache.Initialize(); // or whatever you call it 

    ... 

    app.UseMvc(); 
} 
関連する問題