Autofac heavy Initialize任务

时间:2016-03-17 08:20:10

标签: c# dependency-injection autofac

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 
   }
}

2 个答案:

答案 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);

使用其他组件更新容器。

希望有所帮助:)