首页 > 解决方案 > 如何使用依赖注入在 Worker Service 和 WebService 之间传递公共对象

问题描述

我编写了一个 .net core 3 workerservice,它也有一个内置到同一个项目中的 webapi - 目的是使托管的 workerservice 能够呈现一个 healthcheck webapi,可以对其进行询问以提供 worker 服务状态信息。我们使用一种通用模式向我们所有的 webapi 微服务添加运行状况检查调用。

workerservice 和 webapi 本身都可以正常工作,但我无法弄清楚如何将公共对象注入到两个服务中,以用于在两者之间来回传递数据。

我假设我必须在 Program 类的 CreateHostBuilder 方法中创建状态对象并将其注入两者但找不到任何合适的方法来传递它。

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            // HealthCheck WebAPI
            .ConfigureWebHostDefaults(webBuilder =>
                                        {
                                            webBuilder.UseKestrel();
                                            webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
                                            webBuilder.UseIISIntegration();
                                            webBuilder.UseStartup<Startup>();
                                        })
            .ConfigureHostConfiguration(configHost =>
                                        {
                                            configHost.SetBasePath(Directory.GetCurrentDirectory());
                                            configHost.AddJsonFile("hosting.json", optional: false);
                                        })
            // WorkerService
            .ConfigureAppConfiguration((hostContext, config) =>
                                        {
                                            config
                                                .SetBasePath(Environment.CurrentDirectory)
                                                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                                                .AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName.ToLower()}.json", optional: false);

                                            config.AddEnvironmentVariables();
                                        })
            .ConfigureServices((hostContext, services) =>
                                {
                                    services.AddOptions();
                                    services.AddHostedService<Worker>();
                                });

状态对象可能类似于...

    public class StatusInfo
    {
        public DateTime LastRun { get; set; }
        public int LastAdded { get; set; }
        public int LastUpdated { get; set; }
    }

请问有人帮我吗?

标签: c#.net-coredependency-injectionserviceasp.net-core-webapi

解决方案


只需创建一个知道如何保存和检索共享数据的服务。

过度简化的抽象

public interface IStatusService {
    Task Save(StatusInfo status);
    Task<StatusInfo> Get();
}

将该服务注入工作人员以持久化数据并将其注入控制器以检索数据。


推荐阅读