【问题标题】:.Net Core Generic Host and Dependency Injection with Startup class.Net Core 通用主机和依赖注入与启动类
【发布时间】:2020-09-02 20:20:08
【问题描述】:

这是在我的控制台应用程序中使用依赖注入的启动类的正确方法吗?另外,就事件的顺序而言,我不明白为什么 App Constructor Method 在 Startup Constructor Method 之前运行。

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            ActivatorUtilities.CreateInstance<Startup>(host.Services);
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((context, services) =>
                {
                    services.AddTransient<App>();
                });
    }

    public class Startup
    {
        public Startup(App app)
        {
            Console.WriteLine("Startup Constructor Method");
            app.Run();
        }

        public void Run()
        {
            Console.WriteLine("Startup Run Method");
        }
    }

    public class App
    {
        public App()
        {
            Console.WriteLine("App Constructor Method");
        }

        public void Run()
        {
            Console.WriteLine("App Run Method");
        }
    }
}

【问题讨论】:

  • 我不明白为什么 App Constructor Method 在 Startup Constructor Method 之前运行 - 您的 Startup 构造函数接收 App 的实例,因此 App 构造函数必须运行才能创建实例

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


【解决方案1】:

我在尝试使用 asp.net 用于 Web 应用程序的启动模式构建通用控制台应用程序时遇到了同样的问题,但目前似乎没有该模式的实现,这是有意的

取自https://github.com/aspnet/Hosting/issues/1163

关于 Startup 类的说明 - 虽然 Startup 类的概念非常有用,但它也有很大的问题,因为它需要在启动周期中构建 2 个依赖注入容器。 这会导致在激活 Startup 类和激活 IHostedService 时单例不相同的问题。 这是因为 Startup.ConfigureServices 允许用户添加更多服务,但也允许他们在 Startup.ctor 中托管服务。 到目前为止,我们已选择放弃将启动作为通用主机工作的一部分,但如果我们找到一种更简洁的方法,将来可能会重新添加。

似乎设置启动逻辑的最佳方法是使用 ConfigureAppConfigurationConfigureServices 方法通过 hostbuilder 类。

【讨论】:

    【解决方案2】:

    你可以像下面这样使用:

     var host = new HostBuilder()
                    .ConfigureHostConfiguration(configHost =>
                    {
                        configHost.SetBasePath(Directory.GetCurrentDirectory());
                        configHost.AddEnvironmentVariables(prefix: "ASPNETCORE_");
                        configHost.AddCommandLine(args);
                    })
                    .ConfigureAppConfiguration((hostContext, configApp) =>
                    {
                        configApp.AddJsonFile("appsettings.json", optional: true);
                        configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                        configApp.AddEnvironmentVariables(prefix: "ASPNETCORE_");
                        configApp.AddCommandLine(args);
                    })
                    .ConfigureServices((hostContext, services) =>
                    {
                        services.AddLogging();
                        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
                        services.AddBusinessDIModule(hostContext.Configuration)
                                .AddBusinessServiceBindings();
                        services.AddHostedService<TimedHostedService>();
                    })
                    .ConfigureLogging((hostContext, configLogging) =>
                    {
                        configLogging.AddProvider(
                            new MsSqlLoggerProvider(null, hostContext.Configuration.GetValue<string>("ConnectionStrings:LoggerConnection"), null, "BackgroundWorker"));
                        configLogging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
                    })
                    .UseConsoleLifetime()
                    .Build();
    

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 2020-03-17
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2023-02-24
      • 2017-05-10
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多