繁体   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