依赖注入 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 构造函数中使用它。