c# - AutoFac - 在 app_start 上初始化重量级单例

标签 c# dependency-injection asp.net-mvc-5 singleton autofac

我们的配置是 MVC5 C# 应用程序,使用 AutoFac。

我们有许多单例,如果它们在第一个请求时被初始化,会给用户带来糟糕的体验,因为它们的初始化总共需要大约 3-4 秒。我们正在使用 AutoFac 进行依赖注入(inject),我想知道是否有任何方法可以确保单例(或这些特定的单例)构建在 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;
});

关于c# - AutoFac - 在 app_start 上初始化重量级单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42438452/

相关文章:

c# - 使用请求 header 和正文使 HttpClient 请求可视化 c#

android - Dagger 2 Presenter 注入(inject)返回空值

c# - ASP.NET Core Web API - JWT 消息处理程序 - 没有注册类型错误

asp.net-mvc - 如何使用 ASP.NET MVC 5 应用程序将文件上传到第三个 API 服务?

c# - ASP.NET MVC 5 错误的重定向登录页面

c# - 从 C# 中的变量执行函数

c# - .NET 相当于 Java 的 BufferedReader

c# - 为函数制作时间测量包装类的最佳方法是什么?

JavaScript 依赖注入(inject)

asp.net - 如何设置 MVC5 DropDownList 的选定值?