[英]AutoFac - Initialize heavy-weight singletons on app_start
我們的配置是MVC5 C#app,使用AutoFac。
我們有許多單例,如果它們在第一次請求時初始化,會給用戶帶來糟糕的體驗,因為它們的初始化總共花費大約3-4秒。 我們正在使用AutoFac進行依賴注入,我想知道是否有任何方法可以確保單個(或這些特定的)是在App_Start上構建的,這樣我們就不會在用戶發送第一個請求時浪費時間? 如果沒有,解決這個問題的最佳方法是什么?
這類問題的一般解決方案是在代理實現后隱藏這樣的重量級對象。 這樣,您可以在應用程序啟動時直接觸發初始化過程,而操作在后台運行而不會阻止請求(除非它們在請求期間需要未初始化的數據)。
如果您的代碼如下所示:
// 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;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.