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

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

我正在寻找使用 .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/

    相关文章:

    java - 在 Guice 中注入(inject)通用工厂

    asp.net-core - HttpRequestMessage.Content 在接收 Controller 操作时为空

    c# - 如何在 ASP.NET Core 2.0 中预编译 View ?

    c# - Unity - 如何对同一类型使用多个映射并注入(inject)到一个对象中

    java - 如何在 LibGDX 中正确使用 Dagger 2 的场注入(inject)?

    java - 确定哪些 Spring @Value 注解注入(inject)失败

    asp.net - 如何在Visual Studio 2015的一种解决方案中跨多个ASP.NET CORE项目共享诸如appsettings.json之类的配置文件?

    amazon-web-services - 无法在 AWS Lambda 的 .net 核心上加载文件或程序集 'AWSSDK.Core

    c# - 项目文件不完整。缺少预期的进口

    .net-core - 将.NET Framework 4.6.2迁移到.NET Standard 2.0