Autofac DI有没有办法添加一个初始化方法,该方法将在注册组件的不同线程上运行?
而不是这个:
public class Service
{
public Service()
{
// Heavy init task
}
}
有这个:
public class Service
{
public Service()
{
// No logic
}
// This should run on different thread when Service is created
public void Init()
{
// Heavy init
}
}
答案 0 :(得分:0)
您可以使用lambda表达式进行注册,您可以在其中添加代码。然后你可以启动一个调用init-method的任务。
这样的事情:
builder.Register(c => {
var instance = new Service();
new Task(() => instance.Init()).Start();
return instance;
}).As<IService>().SingleInstance();
答案 1 :(得分:0)
我猜不是。 问题是可能需要Autofac来初始化 service 启动之后的所有内容:存储库,引擎等。如果您需要一个组件来继续服务工作但Autofac仍然处于初始化过程的中间呢?您必须停止处理该服务,等待Autofac继续,然后再次启动该过程......好吧,它就像一个正常的启动过程。
一种可能的选择是使用Autofac IStartable组件。有关详细信息,请查看此answer。
例如,您可以立即加载&#34;服务&#34;所需的一切。启动,并且对可启动部分的需求并不是立即需要的(一种延迟加载)。然后你可以做这样的事情:
var newBuilder = new ContainerBuilder();
newBuilder.Register...;
newBuilder.Update(existingContainer);
使用其他组件更新容器。
希望有所帮助:)