【发布时间】:2020-10-12 05:08:41
【问题描述】:
我有一个临时服务必须进行异步初始化(连接到不同的服务器)。
它公开了一个属性public Task InitTask,可以等到服务初始化。
它还公开了在InitTask 完成后可以保存访问的子服务。
public class Service
{
public Task InitTask { get; }
public ISubService1 SubService1 { get; }
public ISubService2 SubService2 { get; }
public ISubService3 SubService3 { get; }
}
与其他服务器的连接提供的所有功能都由这些子服务捕获。 通常我会注入主服务,然后等待它完成初始化,然后使用这些子服务之一。 但我只想注入这些子服务。
一开始我试过
services.AddTransient<Service>()
.AddTransient(provider =>
{
var server = provider.GetService<Service>();
return server.SubService1;
})
.AddTransient(provider =>
{
var server = provider.GetService<Service>();
return server.SubService2;
})
.AddTransient(provider =>
{
var server = provider.GetService<Service>();
return server.SubService3;
});
但这有一个明显的问题是没有等待主服务的InitTask。
然后(因为子服务是通过接口公开的)我尝试为子服务编写包装类,例如
public class WrapperSubService1 : ISubService1
{
private readonly Service server;
public WrapperSubService1(Service server)
{
this.server = server;
}
private async ValueTask<ISubService1> GetSubService1Async()
{
await server.InitTask
return server.SubService1;
}
// interface implementations
public async Task<Example> GetExampleAsync(...)
{
var subService1 = await this.GetSubService1Async();
return await subService1.GetExampleAsync(...);
}
// many more (also some events and properties)
}
并在启动时执行
services.AddTransient<Service>()
.AddTransient<ISubService1, WrapperSubService1>()
.AddTransient<ISubService2, WrapperSubService2>()
.AddTransient<ISubService3, WrapperSubService3>();
但这也有一个明显的缺陷:代码重复。
我希望是这样的:
services.AddTransient<Service>()
.AddTransient(async provider =>
{
var server = provider.GetService<Service>();
await server.InitTask;
return server.SubService1;
})
.AddTransient(async provider =>
{
var server = provider.GetService<Service>();
await server.InitTask;
return server.SubService2;
})
.AddTransient(async provider =>
{
var server = provider.GetService<Service>();
await server.InitTask;
return server.SubService3;
});
但这只会暴露Task<SubService1> 以供注入。
有什么想法吗?
【问题讨论】:
-
为什么子服务定义为
Service的属性?如果它们可以单独使用,但依赖于Service,那为什么不将Service注入到你的子服务中呢?
标签: c# asp.net-core dependency-injection async-await