#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 / ReportSourceResolver4. @CamiloTerevinto Не могли бы вы сказать мне, почему я был отклонен? И удалили теги из Blazor в C #, в то время как любой, кто столкнется с этой проблемой, будет специфичен для отчетов Telerik для Blazor?
5. Я не могу комментировать отрицательные голоса. Blazor совершенно не имеет значения, это всего лишь вопрос о внедрении зависимостей, и точно такой же вопрос можно задать в любом проекте .NET Standard с использованием Microsoft. Расширения. DependencyInjection