簡體   English   中英

AutoFac - 在app_start上初始化重量級單身人士

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM