DI IN .NET核心无ASP.NET核心



我希望使用.NET Core编写守护程序过程,该过程基本上将像CRON的作业一样行动,并且只需在某个时间间隔安排API/DB调用即可。因此,它无需公开任何Web路线,因此无需ASP.NET Core。

但是,AFAIK ASP.NET CORE是您可能需要的所有DI管道和基于环境的配置的不错的Startup类。

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

  1. 放弃ASP.NET核心,只需自己连接DI框架即可。如果我走那条路,我该怎么办?
  2. 仅适用于DI部分的ASP.NET核心,但是如何在任何请求上下文之外"永远运行"的背景任务?我的理解是,DI框架非常假设有某种进来的请求来协调所有注射。

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

没有启动类的依赖注入。

这绝对是可能的。由于Startup类是WebHostBuilder软件包的一部分(其中包含kestrel/web服务器)。依赖注入是Nuget软件包只是对此软件包的依赖性,因此可以单独使用以下方式:

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 Weel对此进行了优化线程。您也可以在这些任务中使用serviceProvider

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

还要注意使用插件时,当它们加载为DLL时,它们不能卸载,因此,如果您有一个理论上无限量的插件,则每次添加新插件时,内存都会慢慢堆积。

<</p> <</p>

。从 .NET核心文档:

"通用主机的目的是将HTTP管道从Web主机API中解除,以启用更广泛的主机方案..."

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

public static async Task Main(string[] args)
{
  var builder = new HostBuilder()
    .ConfigureAppConfiguration((hostingContext, config) =>
    .ConfigureServices((hostContext, services) =>
    {
       // ...
    });
  await builder.RunConsoleAsync();
}

最新更新