依赖注入 C#
Dependency Injection C#
我在调试时遇到此错误:“InvalidOperationException:在尝试激活 'AppOwnsData.Controllers.HomeController' 时无法解析类型 'AppOwnsData.Services.PowerBiServiceApi' 的服务。”
我已经尝试重写 Controller 和 Startup 中的代码,但仍然抛出相同的错误。将感谢对此的帮助。谢谢!
StartUp.cs:
public void ConfigureServices(IServiceCollection services) {
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
services.AddScoped(typeof(PowerBiServiceApi));
services.AddControllersWithViews(options => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddRazorPages()
.AddMicrosoftIdentityUI();
}
HomeController.cs:
public class HomeController : Controller
{
private PowerBiServiceApi powerBiServiceApi;
public HomeController(PowerBiServiceApi powerBiServiceApi)
{
this.powerBiServiceApi = powerBiServiceApi;
}
PowerBiServiceApi.cs:
public class PowerBiServiceApi {
private ITokenAcquisition tokenAcquisition { get; }
private string urlPowerBiServiceApiRoot { get; }
public PowerBiServiceApi(IConfiguration configuration, ITokenAcquisition tokenAcquisition) {
this.urlPowerBiServiceApiRoot = configuration["PowerBi:ServiceRootUrl"];
this.tokenAcquisition = tokenAcquisition;
}
在您的控制器中使用它之前,您需要将 PowerBiServiceApi 配置为依赖注入。
现在您的 PowerBiServiceApi 需要 urlPowerBiServiceApiRoot ,这是为了
可重用的代码应该作为一个配置。您应该将此字符串抽象为配置 class,例如
/// <summary>
/// PowerBiOptions
/// </summary>
public class PowerBiOptions
{
/// <summary>
/// Url to the powerbi service api
/// </summary>
public string UrlPowerBiServiceApiRoot { get; set; }
}
这可以在依赖注入中配置为
services.Configure<PowerBiOptions>(x =>
{
x.UrlPowerBiServiceApiRoot = Configuration["PowerBi:UrlPowerBiServiceApiRoot"];
});
这可以在您的 PowerBiServiceApi 构造函数中用作
public class PowerBiServiceApi
{
private readonly PowerBiOptions PowerBiOptions;
private ITokenAcquisition tokenAcquisition { get; }
public PowerBiServiceApi(IOptions<PowerBiOptions> PowerBiOptionsAccessor, ITokenAcquisition tokenAcquisition)
{
this.PowerBiOptions = PowerBiOptionsAccessor?.Value;
this.tokenAcquisition = tokenAcquisition;
}
}
然后您可以为您的 PowerBiServiceApi 传递多个配置,而无需在您的 class 构造函数中使用它。
我在调试时遇到此错误:“InvalidOperationException:在尝试激活 'AppOwnsData.Controllers.HomeController' 时无法解析类型 'AppOwnsData.Services.PowerBiServiceApi' 的服务。”
我已经尝试重写 Controller 和 Startup 中的代码,但仍然抛出相同的错误。将感谢对此的帮助。谢谢!
StartUp.cs:
public void ConfigureServices(IServiceCollection services) {
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
services.AddScoped(typeof(PowerBiServiceApi));
services.AddControllersWithViews(options => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddRazorPages()
.AddMicrosoftIdentityUI();
}
HomeController.cs:
public class HomeController : Controller
{
private PowerBiServiceApi powerBiServiceApi;
public HomeController(PowerBiServiceApi powerBiServiceApi)
{
this.powerBiServiceApi = powerBiServiceApi;
}
PowerBiServiceApi.cs:
public class PowerBiServiceApi {
private ITokenAcquisition tokenAcquisition { get; }
private string urlPowerBiServiceApiRoot { get; }
public PowerBiServiceApi(IConfiguration configuration, ITokenAcquisition tokenAcquisition) {
this.urlPowerBiServiceApiRoot = configuration["PowerBi:ServiceRootUrl"];
this.tokenAcquisition = tokenAcquisition;
}
在您的控制器中使用它之前,您需要将 PowerBiServiceApi 配置为依赖注入。 现在您的 PowerBiServiceApi 需要 urlPowerBiServiceApiRoot ,这是为了 可重用的代码应该作为一个配置。您应该将此字符串抽象为配置 class,例如
/// <summary>
/// PowerBiOptions
/// </summary>
public class PowerBiOptions
{
/// <summary>
/// Url to the powerbi service api
/// </summary>
public string UrlPowerBiServiceApiRoot { get; set; }
}
这可以在依赖注入中配置为
services.Configure<PowerBiOptions>(x =>
{
x.UrlPowerBiServiceApiRoot = Configuration["PowerBi:UrlPowerBiServiceApiRoot"];
});
这可以在您的 PowerBiServiceApi 构造函数中用作
public class PowerBiServiceApi
{
private readonly PowerBiOptions PowerBiOptions;
private ITokenAcquisition tokenAcquisition { get; }
public PowerBiServiceApi(IOptions<PowerBiOptions> PowerBiOptionsAccessor, ITokenAcquisition tokenAcquisition)
{
this.PowerBiOptions = PowerBiOptionsAccessor?.Value;
this.tokenAcquisition = tokenAcquisition;
}
}
然后您可以为您的 PowerBiServiceApi 传递多个配置,而无需在您的 class 构造函数中使用它。