【问题标题】:Dependency Injection in a .NET 6 class project without controllers and HTTP没有控制器和 HTTP 的 .NET 6 类项目中的依赖注入
【发布时间】:2023-01-05 19:14:10
【问题描述】:

当您创建一个常规的 .NET 5 或 6 API 项目时,您会得到一些基本类,例如 Program.csStartup.cs。我想在类项目中复制它,因为我希望能够为依赖注入配置我的服务,但我不希望我的项目中有任何控制器或 HTTP。例如,假设我想使用最少的 API/托管创建一个 .NET 6 项目,并且我想检查目录中的文件更改:

程序.cs

static async Task Main(string[] args)
{
    await CreateHostBuilder(args).Build().RunAsync();
}

static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureServices((_, services) => ConfigureServices(services));

static void ConfigureServices(IServiceCollection services)
{
    services.AddTranscient<IFileListener, FileListener>();
}

这可能是一个很好的起点,它与 API 项目中的 Startup.cs 非常相似。

在我的FileListener 类中,我想调用一个方法来侦听文件夹中的文件更改。我们称它为StartListening()。我在哪里调用该方法?在某些时候,我想我需要做类似的事情:

var fileListenerService = ((IServiceCollection)services).BuildServiceProvider().GetService<IListener>();
await fileListenerService.StartListening();

但是哪里? Main 方法里面?在ConfigureServices里面?别的地方?

也许我以错误的方式看待这个问题,但本质上我只需要调用一个方法并让它运行该方法直到应用程序关闭。

【问题讨论】:

  • 您的文件侦听器看起来很像hosted service,因此您可以将其实现/注册为一个。
  • @GuruStron 嗯,这基本上就是我想要实现的目标。目前,我只是在 ConfigureServices 方法中执行了 2 行代码,但我不必使用托管服务来执行此操作。惊人的。非常感谢你!

标签: c# asp.net-core dependency-injection .net-6.0


【解决方案1】:

微软的托管有一个hosted services的概念来处理后台任务,所以你可以把你的FileListener变成托管服务,然后用AddHostedService在DI中注册它,托管会自动启动它,并支持DI和取消信号。

请注意,使用托管服务中的作用域服务(如默认注册的 EF 上下文)需要 a little bit extra work

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多