C# 重初始化任务
Autofac DI有没有办法为注册的组件添加将在不同线程上运行的初始化方法 而不是这样: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
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
来获得一个合适的实例,但是我怎么可能知道呢?这只是一颗定时炸弹。。。