C# 重初始化任务

C# 重初始化任务,c#,dependency-injection,autofac,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 wh

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

您可以使用lambda表达式进行注册,您可以在其中添加代码。然后可以启动一个调用init方法的任务

大概是这样的:

builder.Register(c => {
    var instance = new Service();
    new Task(() => instance.Init()).Start();
    return instance;
}).As<IService>().SingleInstance();
var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);
builder.Register(c=>{
var实例=新服务();
新任务(()=>instance.Init()).Start();
返回实例;
}).As().SingleInstance();
我想不是。 问题是,可能需要Autofac来初始化服务启动后的所有内容:存储库、引擎等等。如果您需要一个组件继续服务工作,但AutoFac仍处于初始化过程中呢?您必须停止处理该服务,等待Autofac继续,然后再次启动该过程。。。这就像一个正常的启动过程

一种可能的选择是使用Autofac IStartable组件。查看此项了解更多详细信息

例如,您可以立即加载“服务”启动所需的所有内容,并向startable部分请求不立即需要的所有内容(一种延迟加载)。然后你可以这样做:

builder.Register(c => {
    var instance = new Service();
    new Task(() => instance.Init()).Start();
    return instance;
}).As<IService>().SingleInstance();
var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);
使用其他组件更新容器


希望有帮助:)

为什么不能自己从构造函数开始“重初始化”?最后,正确初始化是您的类的责任。如果依赖DI容器来交付正确实例化的实例,那么这不是一个好的封装。总有一天会有人仅仅因为它是公共的而使用构造函数,而你的类将被实例化为无效状态。我真的不喜欢这样,因为这个类有一个公共构造函数,但它什么都不做。而且,需要调用
Init
来获得一个合适的实例,但是我怎么可能知道呢?这只是一颗定时炸弹。。。