ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-11 17:14:42  阅读:372  来源: 互联网

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


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

我们有很多单例,如果它们是在第一个请求中初始化的,那么它们会对用户造成不良的体验,因为它们的初始化总共需要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;
});

标签:asp-net-mvc-5,dependency-injection,singleton,c,autofac
来源: https://codeday.me/bug/20191111/2021508.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有