gpt4 book ai didi

c# - 在其他服务中访问 MVC DI 服务

转载 作者:行者123 更新时间:2023-11-30 20:29:06 26 4
gpt4 key购买 nike

我正在构建一个 HealthAPI 类库,它为我们的 HealthMonitor 服务提供统计列表。

我已经成功地完成了这项工作,中间件正在记录服务启动时间和响应时间,我们的健康监视器能够通过调用我们的 StatusController 来解析这些值。其中有许多操作返回 IActionResult JSON 响应。

我们打算在我们的所有服务中重用它,因此选择将 API Controller 与 DI 服务和中间件一起保留在类库中,以使 Controller 可访问我最初做了以下操作。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddApplicationPart(Assembly.Load(new AssemblyName("HealthApiLibrary"))); //Bring in the Controller for HealthAPI;
services.AddSingleton<HealthApiService>();
}

但是在重构阶段,我想通过执行以下操作来稍微清理一下:

1) 重构 services.AddSingleton<HealthApiService>();进入services.AddHealthApi(); (我们还没有为此做任何工作,但在回答这个问题时仍然可能是相关的)

2) 作为 services.AddHealthApi(); 的一部分加载我的 StatusController打电话。

我尝试了以下方法:

public class HealthApiService
{
public HealthApiService(IMvcBuilder mvcBuilder)
{
mvcBuilder.AddApplicationPart(Assembly.Load(new AssemblyName("HealthApiLibrary"))); //Bring in the Controller for HealthAPI

ResponseTimeRecords = new Dictionary<DateTime, int>();
ServiceBootTime = DateTime.Now;
}

public DateTime ServiceBootTime { get; set; }
public Dictionary<DateTime,int> ResponseTimeRecords { get; set; }
public string ApplicationId { get; set; }
}

但是这只会产生以下错误:

InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.DependencyInjection.IMvcBuilder' while attempting to activate 'HealthApiLibrary.Services.HealthApiService'.

最佳答案

<强>1。依赖注入(inject)

您得到异常是因为服务集合中没有注册IMvcBuilder。将此类型添加到集合中没有意义,因为它仅在启动期间使用。

<强>2。扩展方法

您可以创建一个扩展方法来实现您想要的方法。

public static class AddHealthApiExtensions
{
public static void AddHealthApi(this IServiceCollection services)
{
services.AddSingleton<HealthApiService>();
}
}

<强>3。程序集.加载

看看@Tseng 的评论。

关于c# - 在其他服务中访问 MVC DI 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46601507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com