【发布时间】:2022-01-17 23:16:18
【问题描述】:
我有一个简单的 C# .NET Core 5 控制台应用程序,我需要将依赖注入 (Microsoft.Extensions.DependencyInjection) 添加到该应用程序。如果它想启动一个微服务,我知道该怎么做,但是如果我只想用 DI 作为常规控制台应用程序运行它怎么办?
我得到了这个代码:
static void Main(string[] args)
{
var serviceName =
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
var configurationBuilder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json").Build();
var appSettings = configurationBuilder.Get<AppSettings>();
Log.Information("{@serviceName} test starting up.", serviceName);
Host.CreateDefaultBuilder(args)
.UseMyAppMQ(context => context.UseSettings(appSettings.MQSettings))
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
.ConfigureServices((hostContext, services) =>
{
services
.Configure<MQSettings>(configurationBuilder.GetSection("MQSettings"))
.AddTransient<ITestController>(s => new TestController());
})
.Build().Run();
Log.Information("{@serviceName} test closing down.", serviceName);
}
我需要一个入口点,我可以在其中运行我的底层类 run 方法,但是如何?
问候
【问题讨论】:
-
这个已经在worker模板中提供了,实际上需要的代码要少得多。运行
dotnet new worker并检查代码。这将创建一个控制台应用程序,该应用程序启动所有已注册的BackgroundService派生类。如果您想在其中一项服务结束时终止应用程序,您必须通过注入IHostApplicationLifetime并调用StopApplication()来告诉主机 -
用它的接口注入你的类(即:.AddTransient
();)。然后使用中间件调用你的类运行方法(即:app.Use())。看到这个:docs.microsoft.com/en-us/dotnet/core/extensions/… 和这个:docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/… -
否则不用调用
Run(),直接用Build()获取主机即可。向主机明确请求“服务”,调用其方法并在完成后退出应用程序。