代码之家  ›  专栏  ›  技术社区  ›  MortenMoulder

在一个应用程序中进行依赖注入。不带控制器和HTTP的NET6类项目

  •  0
  • MortenMoulder  · 技术社区  · 3 年前

    当你创建一个常规的。NET 5或6 API项目,您可以获得一些基本类,例如 Program.cs Startup.cs .我想在一个类项目中复制它,因为我想能够为依赖注入配置我的服务,但我不想在我的项目中使用任何控制器或HTTP。举个例子,假设我想创建一个。NET 6项目使用最小API/托管,我想检查目录中的文件更改:

    程序反恐精英

    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项目中。

    在我的内心 FileListener 类,我想调用一个方法,该方法侦听文件夹中的文件更改。就这么定了 StartListening() .我该怎么称呼这种方法呢?在某个时刻,我想我需要做一些事情,比如:

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

    但是在哪里呢?里面 Main 方法在…内 ConfigureServices ? 其他地方?

    也许我看得不对,但本质上我只需要调用一个方法,让它运行该方法,直到应用程序关闭。

    0 回复  |  直到 3 年前
        1
  •  1
  •   Guru Stron    3 年前

    微软的主机有一个 hosted services 来处理后台任务,这样你就可以 FileListener 进入托管服务并在DI中注册 AddHostedService 主机将通过DI和取消信号支持自动启动。

    请注意,从托管服务中使用作用域服务需要 a little bit extra work .