簡體   English   中英

.Net Core 通用主機和依賴注入與啟動類

[英].Net Core Generic Host and Dependency Injection with Startup class

這是在我的控制台應用程序中使用依賴注入的啟動類的正確方法嗎? 另外,就事件的順序而言,我不明白為什么 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");
        }
    }
}

在此處輸入圖片說明

你可以像下面這樣使用:

 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();

我在嘗試使用 asp.net 用於 Web 應用程序的啟動模式構建通用控制台應用程序時遇到了同樣的問題,但似乎該模式目前沒有實現,這是有意的

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

關於啟動類的說明 - 雖然啟動類的概念非常有用,但它也有很大的問題,因為它需要在啟動周期中構建 2 個依賴注入容器。 這會導致在激活 Startup 類和激活 IHostedService 時單例不相同的問題。 這是因為 Startup.ConfigureServices 允許用戶添加更多服務,但也允許他們在 Startup.ctor 中托管服務。 到目前為止,我們已經選擇放棄將啟動作為通用主機工作的一部分,但如果我們想出一種更簡潔的方法來完成它,則有可能在未來的任何時候重新添加。

似乎設置啟動邏輯的最佳方法是使用ConfigureAppConfigurationConfigureServices方法通過 hostbuilder 類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM