このタイプの問題の一般的な解決策は、プロキシーの実装後にそのような重いオブジェクトを隠すことです。この方法では、アプリケーションの起動時に直接初期化プロセスを起動できますが、操作はブロックされないバックグラウンドで実行されます(要求時に初期化されていないデータが必要な場合を除きます)。
あなたのコードは次のようになります場合:
// 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;
});
これは、おそらくあなたが得る可能性がある長いアプリの起動時間をいくらかバイパスするので、おそらくこの問題に対するよりよい解決策になるでしょうが、 [Autofacの 'IStartable'または' AutoActivate'サポート(http://autofac.readthedocs.io/en/latest/lifetime/startup.html)を使用してください。ここでは、バックグラウンド初期化戦略と組み合わせてこれを行うことができます。 –