没有控制器和 HTTP 的 .NET 6 class 项目中的依赖注入
Dependency Injection in a .NET 6 class project without controllers and HTTP
当您创建一个常规的 .NET 5 或 6 API 项目时,您会得到一些基本的 class,例如 Program.cs
和 Startup.cs
。我想在 class 项目中复制它,因为我希望能够为依赖注入配置我的服务,但我不希望我的项目中有任何控制器或 HTTP。例如,假设我想使用最小 API/hosting 创建一个 .NET 6 项目,并且我想检查目录中的文件更改:
Program.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
class 中,我想调用一个方法来侦听文件夹中的文件更改。我们称它为 StartListening()
。我在哪里调用该方法?在某些时候,我想我需要做类似的事情:
var fileListenerService = ((IServiceCollection)services).BuildServiceProvider().GetService<IListener>();
await fileListenerService.StartListening();
但是在哪里呢?在 Main
方法中?在 ConfigureServices
里面?其他地方?
也许我看错了,但本质上我只需要调用一个方法并使其成为 运行 那个方法,直到应用程序关闭。
微软的托管有一个hosted services的概念来处理后台任务,所以你可以把你的FileListener
变成托管服务,然后用AddHostedService
在DI中注册,托管就会开始它自动支持 DI 和取消信号。
请注意,使用托管服务中的作用域服务需要 a little bit extra work。
当您创建一个常规的 .NET 5 或 6 API 项目时,您会得到一些基本的 class,例如 Program.cs
和 Startup.cs
。我想在 class 项目中复制它,因为我希望能够为依赖注入配置我的服务,但我不希望我的项目中有任何控制器或 HTTP。例如,假设我想使用最小 API/hosting 创建一个 .NET 6 项目,并且我想检查目录中的文件更改:
Program.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
class 中,我想调用一个方法来侦听文件夹中的文件更改。我们称它为 StartListening()
。我在哪里调用该方法?在某些时候,我想我需要做类似的事情:
var fileListenerService = ((IServiceCollection)services).BuildServiceProvider().GetService<IListener>();
await fileListenerService.StartListening();
但是在哪里呢?在 Main
方法中?在 ConfigureServices
里面?其他地方?
也许我看错了,但本质上我只需要调用一个方法并使其成为 运行 那个方法,直到应用程序关闭。
微软的托管有一个hosted services的概念来处理后台任务,所以你可以把你的FileListener
变成托管服务,然后用AddHostedService
在DI中注册,托管就会开始它自动支持 DI 和取消信号。
请注意,使用托管服务中的作用域服务需要 a little bit extra work。