gpt4 book ai didi

dependency-injection - 没有 ASP.NET Core 的 .NET Core 中的 DI

转载 作者:行者123 更新时间:2023-12-04 15:19:10 24 4
gpt4 key购买 nike

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

但是,afaik ASP.NET Core 是您获得如此美妙的地方 Startup具有您可能需要的所有 DI 管道和基于环境的配置的类。

在我看来,我有两个选择:

  • 放弃 ASP.NET Core 并自己连接 DI 框架。如果我走那条路,我该怎么做?
  • 仅针对 DI 部分包含 ASP.NET Core,但是如何生成在任何请求上下文之外“永远运行”的后台任务?我的理解是 DI 框架非常假设有某种传入请求来协调所有注入(inject)。
  • 最佳答案

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

    没有启动类的依赖注入(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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com