2017-02-24 63 views
2

我们的配置是使用AutoFac的MVC5 C#应用程序。AutoFac - 在app_start上初始化大量单身人士

我们有许多单身人士,如果他们用第一个请求进行初始化,会给用户带来不好的体验,因为他们的初始化总共需要大约3-4秒。我们使用AutoFac进行依赖注入,我想知道是否有任何方法确保单身人士(或这些特定人员)构建在App_Start上,这样我们就不会在用户发送第一个请求时失去时间?如果不是,解决这个问题的最好方法是什么?

回答

2

这种类型的问题的一般解决方案是在代理实现后隐藏如此重的对象。这样,您可以在应用程序启动时直接触发初始化过程,而操作在后台运行,而不会阻止请求(除非它们在请求期间需要未初始化的数据)。

如果您的代码如下所示:

// 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() => ... 
} 

代理可以如下创建:

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; 
}); 
+1

这就是:

public class LazyMyServiceProxy : IMyService { private readonly Lazy<IMyService> lazyService; public LazyMyServiceProxy(Lazy<IMyService> lazyService) { this.lazyService = lazyService; } public ServiceData GetData() => this.lazyService.Value.GetData(); } 

如下您可以使用此代理可能是一个更好的解决方案,因为它有些绕过了长时间的应用程序启动时间,否则你可能会得到,但你也可以[使用Autofac的'IStartable'或'AutoActivate'支持](http://autofac.readthedocs.io/en/latest/lifetime/startup.html)。你可以在这里结合后台初始化策略来做到这一点。 –