我正在寻找使用 .NET Core 编写一个守护进程,它基本上就像一个 cron 作业,只是在某个时间间隔编排 API/DB 调用。因此,它不需要公开任何 Web 路由,因此不需要 ASP.NET Core。
但是,afaik ASP.NET Core 是您获得如此美妙的地方 Startup
具有您可能需要的所有 DI 管道和基于环境的配置的类。
在我看来,我有两个选择:
最佳答案
您似乎提出了多个问题,让我尝试一一回答。
没有启动类的依赖注入(inject)。
这绝对是可能的。由于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 加载时,它们无法卸载,因此如果理论上您有无限数量的插件,那么每次添加新插件时,您的内存都会慢慢积累。
关于dependency-injection - 没有 ASP.NET Core 的 .NET Core 中的 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42662913/