有一个后台服务。如何向其传递 int 参数?那些。在安装文件中,我从 appsettings 收到一个变量,我想在注册期间将其传递给服务。
public class TestService : BackgroundSerice
{
private readonly IServiceProvider _serviceProvider;
// Нужно передать someValue при регистрации сервиса
public TestService(IServiceProvider serviceProvider, int someValue)
{
_serviceProvider = serviceProvider;
}
//...
}
正常注册是这样完成的(如果不需要传递 someValue):
builder.Services.AddHostedService<TestService>();
假设我们有这样的服务:
我们的任务是向他传达
int value
这个问题……如何?有几种选择:
通过执行以下操作在注册期间传递此值:
在这里,我们注册的不是为我们创建的类型,而是该类的完整实例,我们自己填写必要的数据。
为了美观,我们可以制作自己的扩展方法:
那么注册就会很简单
builder.Services.AddTestService(1000);
。如果设置很多,那么传下去Action<>
,就标准化了AddTestService (options => { options.Value = ...; })
我们可以创建一个类来存储必要的数据并通过 DI 请求它。让其中一个选项如下所示:
我们在服务中请求此类:
好吧,让注册像这样:
就是这样,然后 DI 容器会为我们初始化一切并实现它。该示例当然是马马虎虎,但实际上,即使您从服务器接收设置,带有设置的类也可以按照您需要的方式工作。
既然我们触及了设置,那么您就可以使用它们了。
让我们创建一个包含必要设置的文件,假设它是
config.json
:我们来注册一下:
然后我们在服务中使用它,将依赖项转发到那里
IConfiguration configuration
,并在正确的位置读取所需的设置configuration["TestServiceOptions:SomeInt"]
。如果我们需要在更改文件中的设置时动态更改数据,那么在注册配置时我们设置
reloadOnChange
(.AddJsonFile("config.json", true, reloadOnChange: true)
)。好吧,为了方便处理这一切,我们使用设置模式 (
IOptions
):让我们创建一个与设置匹配的类:
IOptions
注册文件后配置:我们在服务中使用它,并将其转发
IOptions<TestServiceOptions> options
到正确的位置options.Value.SomeInt
。但请记住,您需要对自动更新文件中的值进行一些修改,我将把它留给您。
实际上,这里有 3 种不同的方法,任选一种即可使用。当然还有其他选择,但这些基本上是主要的。
如果我理解正确的话,那么这就是可能的。我正在使用带有 appsettings 设置的静态服务
程序