c# - 创建并运行默认主机后如何访问服务提供者?
问题描述
我有一个 .NET Core 控制台应用程序并创建一个新的默认主机实例。我在静态扩展类中配置我的服务,并且有一个服务是单例的。在我的Program
文件中,我必须访问一次实例,以便从中调用方法。
鉴于此示例代码
class Program
{
public static void Main(string[] args)
=> new Program()
.MainAsync(args)
.GetAwaiter()
.GetResult();
private async Task MainAsync(string[] args)
{
await Host.CreateDefaultBuilder(args)
.ConfigureServices((hostBuilderContext, serviceCollection) =>
{
// This comes from another class configuring all the services for the serviceCollection
serviceCollection.AddSingleton<MyService>();
})
.Build()
.RunAsync();
// Get access to the service provider
// Get MyService instance from the service provider
}
}
有没有办法在方法下方动态创建服务提供者的新实例RunAsync
?
解决方案
Host.CreateDefaultBuilder
返回IHostBuilder
which 提供IHostBuilder.Build
which 反过来返回IHost
。IHost
包含 IHost.Services
表示已配置 DI 容器的属性。如果您想访问它,请IHost
在启动之前将其存储在变量中。
private async Task MainAsync(string[] args)
{
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostBuilderContext, serviceCollection) =>
{
// This comes from another class configuring all the services for the serviceCollection
serviceCollection.AddSingleton<MyService>();
})
.Build();
await host.StartAsync();
var myService = host.Services.GetRequiredService<MyService>();
/* some useful code */
await host.WaitForShutdownAsync();
}
推荐阅读
- wordpress - How do I resize the display size of woocommerce products?
- json - JSONPATH 过滤器无法匹配值
- asp.net-mvc - ASP.NET MVC 中的实体框架和 Web 服务有什么区别?
- python - 在一个类中循环另一个函数时执行一次函数——Python
- python - 在 python .py 文件中安装模块
- python - 我在 kivy 应用中的广告没有显示 kivmob
- centos - 无法连接到 openstack 服务列表
- c# - 在 BeginLifetimeScope 配置中使用 RegisterInstance 会导致内存泄漏
- reactjs - 输入在 HOC 组件内失去焦点
- python - 关于如何调整我的代码以将正确的表作为数据框返回有什么建议吗?