[英].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 中托管服務。 到目前為止,我們已經選擇放棄將啟動作為通用主機工作的一部分,但如果我們想出一種更簡潔的方法來完成它,則有可能在未來的任何時候重新添加。
似乎設置啟動邏輯的最佳方法是使用ConfigureAppConfiguration
和ConfigureServices
方法通過 hostbuilder 類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.