没有ASP.NET Core的.NET Core中的DI

时间:2017-03-08 04:15:32

标签: dependency-injection asp.net-core .net-core daemon

我正在寻找使用.NET Core编写一个守护程序进程,它基本上就像一个chron作业,只是在某个时间间隔内编排API / DB调用。因此,它不需要公开任何Web路由,因此不需要ASP.NET Core。

然而,afaik ASP.NET Core是您可以获得所有可能需要的所有DI管道和基于环境的配置的良好Startup类的地方。

我看到它的方式,我有两个选择:

  1. 放弃ASP.NET Core并自己连接DI框架。如果我走这条路,我该怎么做?
  2. 仅为DI部分包含ASP.NET Core,但是如何在任何请求上下文之外生成“永远运行”的后台任务?我的理解是DI框架非常假设存在某种进入请求以协调所有注入。

2 个答案:

答案 0 :(得分:1)

您似乎提出了多个问题让我尝试逐一回答。

没有启动类的依赖注入。

这绝对是可能的。由于Startup类是WebHostBuilder包(包含Kestrel / webserver)的一部分。 The Dependency injection is nuget package只是对此包的依赖,因此可以通过以下方式单独使用:

var services = new ServiceCollection();
services.AddTransient<IMyInterface, MyClass>();
var serviceProvider = services.BuildServiceProvider(); //ioc container
serviceProvider.GetService<IMyInterface>();

因此,在您的程序主(启动功能)中,您可以添加此代码,甚至可以使ServiceProvider Staticaly可用。

请注意,IHostingEnvironment也是kestrel包的一部分,不适合您,但有一些简单的解决方法。

注册

我不确定通过产生后台任务/永远运行你究竟是什么意思。但是在dotnet中你可以用TaskCreationOptions.LongRunning生成任务来告诉调度程序你的任务将运行很长时间并且dotnet wel优化线程。您也可以在这些任务中使用serviceProvider

DI的唯一缺点是您需要在应用程序启动时进行设置,并且在运行应用程序时无法添加新服务(实际上您可以添加到服务然后重新构建serviceProvider,但使用其他服务器更容易外部IOC容器)。如果您考虑运行某种类型的插件系统,其中依赖项会自动注册,那么您最好自己制作工厂方法。

另外请注意,在使用插件时,如果它们以dll的形式加载,则无法卸载它们,因此如果您有理论上无限量的插件,每次添加新插件时内存都会慢慢增加。 / p>

答案 1 :(得分:1)

.NET Core 2.1中的更新可以/应该使用通用主机来完成。来自.NET Core文档:

“通用主机的目标是将HTTP管道与Web主机API分离开来,以实现更广泛的主机方案...”

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1

public static async Task Main(string[] args)
{
  var builder = new HostBuilder()
    .ConfigureAppConfiguration((hostingContext, config) =>

    .ConfigureServices((hostContext, services) =>
    {
       // ...
    });

  await builder.RunConsoleAsync();
}