Разрешение AuthenticationStateProvider в startup.cs

#c# #asp.net-core #dependency-injection #telerik-reporting

#c# #asp.net-ядро #внедрение зависимостей #telerik-отчетность

Вопрос:

У меня есть проект Blazor. В startup.cs AuthenticationStateProvider вводится в серверную часть. Я использую его как конструктор для одного класса.

  public class ServiceClass : IServiceClass
{
    public ServiceClass(AuthenticationStateProvider authenticationStateProvider)
    {
        _authenticationStateProvider = authenticationStateProvider;
    }
    private readonly AuthenticationStateProvider _authenticationStateProvider;
    public async Task<string> GetIdentity()
    {
        var identity="";
        return identity;
    } 
}
  

И ServiceClass также вводится в startup.cs

 services.AddScoped<IServiceClass, ServiceClass>();
  

Теперь есть еще одна служба, которую мне нужно внедрить, которая зависит от ServiceClass

  services.AddScoped<IReportServiceConfiguration>(sp =>
            new ReportServiceConfiguration
            {
                ReportingEngineConfiguration = sp.GetService<IConfiguration>(),
                HostAppId = "Html5DemoAppCore",
                Storage = new FileStorage(),
                ReportSourceResolver = new CustomReportSourceResolver(),
            }
            ); ;
  

Но я не могу использовать ReportSourceResolver = new CustomReportSourceResolver() , потому что у него есть ServiceClass в конструкторе. И я не могу использовать sp.GetService(), потому что тогда authenticationStateProvider возвращает значение null (я думаю, из-за другой области видимости). Как я могу зарегистрировать эту последнюю службу?

Я уже пытался использовать IScopeFactory для замены конструкторов классов, но понял, что мы не можем это использовать, потому что создание новой области возвращает AuthenticationStateProvider null . Я пытался использовать

  var serviceProvider = services.BuildServiceProvider();
var service = serviceProvider.GetService<CustomReportResolver>();
  

Я полагаю, это не работает, потому что для этого необходимо зарегистрировать все необходимые службы перед BuildServiceProvider(), и мы не знаем, в какой момент вводится AuthenticationStateProvider .

Пытался использовать Autofac вместо внедрения зависимостей .Net Core, но столкнулся с той же проблемой, потому что AuthenticationStateProvider все еще зарегистрирован в системе .net core DI.

Комментарии:

1. Не создавайте экземпляр ReportServiceConfiguration вручную. Используйте конструктор, который может получить необходимые параметры из внедрения зависимостей. Похоже, что 3 значения уже в порядке, вам просто нужно либо избавиться от жестко запрограммированного HostAppId , либо использовать другой класс, который вы можете внедрить

2. Настройка службы отчетов является частью пакета отчетов Telerik. Я не могу редактировать этот класс, есть ли другой способ сделать это?

3. Ввести значение по умолчанию ReportServiceConfiguration и установить вручную HostAppId ? В любом случае у него есть общедоступный установщик. В противном случае вам нужно будет использовать sp.GetRequiredService<service> for Storage / ReportSourceResolver

4. @CamiloTerevinto Не могли бы вы сказать мне, почему я был отклонен? И удалили теги из Blazor в C #, в то время как любой, кто столкнется с этой проблемой, будет специфичен для отчетов Telerik для Blazor?

5. Я не могу комментировать отрицательные голоса. Blazor совершенно не имеет значения, это всего лишь вопрос о внедрении зависимостей, и точно такой же вопрос можно задать в любом проекте .NET Standard с использованием Microsoft. Расширения. DependencyInjection