C# 带有启动类的.Net核心通用主机和依赖项注入

C# 带有启动类的.Net核心通用主机和依赖项注入,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,这是在我的控制台应用程序中使用依赖项注入的启动类的正确方法吗?另外,就事件顺序而言,我不明白为什么应用构造函数方法在启动构造函数方法之前运行 using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; using System; namespace ConsoleApp1 { class Program { public static void Main(

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

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");
        }
    }
}
使用Microsoft.Extensions.Hosting;
使用Microsoft.Extensions.DependencyInjection;
使用制度;
名称空间控制台EAPP1
{
班级计划
{
公共静态void Main(字符串[]args)
{
var host=CreateHostBuilder(args.Build();
ActivatorUtilities.CreateInstance(host.Services);
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureServices((上下文、服务)=>
{

services.AddTransient

您可以使用以下方法:

var host=new HostBuilder()
.ConfigureHostConfiguration(configHost=>
{
configHost.SetBasePath(Directory.GetCurrentDirectory());
configHost.AddEnvironmentVariables(前缀:“ASPNETCORE”);
configHost.AddCommandLine(args);
})
.ConfigureAppConfiguration((主机上下文,configApp)=>
{
configApp.AddJsonFile(“appsettings.json”,可选:true);
configApp.AddJsonFile($“appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json”,可选:true);
configApp.AddEnvironmentVariables(前缀:“ASPNETCORE”);
configApp.AddCommandLine(args);
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddLogging();
services.AddSingleton();
services.AddBusinessDIModule(hostContext.Configuration)
.AddBusinessServiceBindings();
services.AddHostedService();
})
.ConfigureLogging((主机上下文,配置日志)=>
{
configLogging.AddProvider(
新的MSSQLSLoggerProvider(null,hostContext.Configuration.GetValue(“ConnectionString:LoggerConnection”)、null,“BackgroundWorker”);
configLogging.AddConfiguration(hostContext.Configuration.GetSection(“Logging”));
})
.UseConsoleLifetime()文件
.Build();

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

取自

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

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

我不明白为什么应用构造函数方法在启动构造函数方法之前运行-您的启动构造函数接收到一个应用实例,因此应用构造函数或必须运行才能创建实例