2017-02-24 7 views
2

私たちの設定は、AutoFacを使用しているMVC5 C#アプリです。AutoFac - app_startで重いシングルトンを初期化する

多くのシングルトンは最初のリクエストで初期化された場合、初期化に合計3〜4秒かかるため、ユーザーにとって使い勝手が悪くなります。 Dependency InjectionにAutoFacを使用していますが、ユーザーが最初のリクエストを送信したときに時間を失わないように、シングルトン(またはこれらの特定のもの)がApp_Start上に構築されていることを確認する方法があれば疑問です。そうでない場合、この問題を解決する最善の方法は何ですか?

答えて

2

このタイプの問題の一般的な解決策は、プロキシーの実装後にそのような重いオブジェクトを隠すことです。この方法では、アプリケーションの起動時に直接初期化プロセスを起動できますが、操作はブロックされないバックグラウンドで実行されます(要求時に初期化されていないデータが必要な場合を除きます)。

あなたのコードは次のようになります場合:

// The abstraction in question 
public interface IMyService 
{ 
    ServiceData GetData(); 
} 

// The heavy implementation 
public class HeavyInitializationService : IMyServic { 
    public HeavyInitializationService() { 
     // Load data here 
     Thread.Sleep(3000); 
    } 
    public ServiceData GetData() => ... 
} 

次のようにプロキシを作成することができます。

public class LazyMyServiceProxy : IMyService { 
    private readonly Lazy<IMyService> lazyService; 
    public LazyMyServiceProxy(Lazy<IMyService> lazyService) { 
     this.lazyService = lazyService; 
    } 
    public ServiceData GetData() => this.lazyService.Value.GetData(); 
} 

次のように、このプロキシを使用することができます。

Lazy<IMyService> lazyService = new Lazy<IMyService>(() => 
    new HeavyInitializationService()); 

container.Register<IMyService>(c => new LazyMyServiceProxy(lazyService)) 
    .SingleInstance(); 

// Trigger the creation of the heavy data on a background thread: 
Task.Factory.StartNew(() => { 
    // Triggers the creation of HeavyInitializationService on background thread. 
    var v = lazyService.Value; 
}); 
+1

これは、おそらくあなたが得る可能性がある長いアプリの起動時間をいくらかバイパスするので、おそらくこの問題に対するよりよい解決策になるでしょうが、 [Autofacの 'IStartable'または' AutoActivate'サポート(http://autofac.readthedocs.io/en/latest/lifetime/startup.html)を使用してください。ここでは、バックグラウンド初期化戦略と組み合わせてこれを行うことができます。 –

関連する問題