#c# #dependency-injection #controller #asp.net-core-mvc
#c# #внедрение зависимостей #контроллер #asp.net-ядро-mvc
Вопрос:
Я ищу решение, чтобы внедрить регистратор в универсальный контроллер:
[Microsoft.AspNetCore.Mvc.ApiController]
[Microsoft.AspNetCore.Mvc.Route("api/v1/[controller]")]
public partial class BaseController<TEntity, TId, T>
: Microsoft.AspNetCore.Mvc.ControllerBase
where
TEntity : class,
SG.src.Xample.Entity.Interfaces.IEntity<TId, T>
where
TId : SG.src.Xample.Entity.Interfaces.IIdentifier<T>,
new()
{
public readonly SG.src.Xample.Repository.Interfaces.IRepository<TEntity, TId, T> _repository;
public readonly Microsoft.Extensions.Logging.ILogger<BaseController<TEntity, TId, T>> _logger;
public BaseController(
Microsoft.Extensions.Logging.ILogger<BaseController<TEntity, TId, T>> logger,
SG.src.Xample.Repository.Interfaces.IRepository<TEntity, TId, T> repository)
{
_repository = repository;
_logger = logger;
}
…
services.AddSingleton(
typeof(Microsoft.Extensions.Logging.ILogger<>),
typeof(SG.src.Xample.Logger.ControllerLogger<>));
…
Во время выполнения не распознается, что контроллер наследует от ControllerBase.
Некоторые службы не могут быть созданы (ошибка при проверке дескриптора службы ‘ServiceType: Microsoft.Расширения.Хостинг.Срок службы IHostApplicationLifetime: Одноэлементный тип реализации: Microsoft.Расширения.Хостинг.Внутренний.ApplicationLifetime’: GenericArguments[0], ‘Microsoft.Расширения.Хостинг.Внутренний.ApplicationLifetime’, на ‘SG.src.Xample.Регистратор.ControllerLogger ‘1 [TController]’ нарушает ограничение типа ‘TController’.) (Ошибка при проверке дескриптора службы ‘ServiceType: Microsoft.Расширения.Хостинг.Время жизни IHostLifetime: Одноэлементный тип реализации: Microsoft.Расширения.Хостинг.Внутренний.ConsoleLifetime’: GenericArguments[0], ‘Microsoft.Расширения.Хостинг.Внутренний.ApplicationLifetime ‘,
public class ControllerLogger<TController> : Microsoft.Extensions.Logging.ILogger<TController>
where
TController : Microsoft.AspNetCore.Mvc.ControllerBase
{
public ControllerLogger()
{
}
public System.IDisposable BeginScope<TState>(TState state)
{
return default;
}
public bool IsEnabled(Microsoft.Extensions.Logging.LogLevel logLevel)
{
return true;
}
public void Log<TState>(
Microsoft.Extensions.Logging.LogLevel logLevel,
Microsoft.Extensions.Logging.EventId eventId,
TState state,
System.Exception exception,
System.Func<TState, System.Exception, string> formatter)
{
}
}
Комментарии:
1. Нужна дополнительная информация. Что такое SG.src.Xample. Регистратор. ControllerLogger?
2. @WiseGuy: контроллер общедоступного класса <TController> : Microsoft. Расширения. Ведение журнала. ILogger<TController> где TController : Microsoft. AspNetCore.Mvc.ControllerBase {…} Пока не вызывается, я использую только NotImplementedExceptions для методов.
3. @Steven: Спасибо за форматирование. Надеюсь, на следующий вопрос я смогу сделать это сам…
4. Похоже, вы на правильном пути, но неправильно реализуете службу регистратора. Ознакомьтесь с этой страницей документации MS .net Core, она должна помочь вам начать работу. docs.microsoft.com/en-us/dotnet/core/extensions /…
5. Вы удалили службы. Также добавляется строка Singleton?
Ответ №1:
Ответ WiseGuy — это решение. Я надеялся получить более простое решение в .net core 3.1, но это правильный путь. Спасибо, мудрец! В частности, я искал общую реализацию ilogger. Но единственный способ решить эту проблему — выполнить инициализацию logger loggerprovider в Program.cs для каждого универсального подтипа. В текущем решении у меня есть один регистратор для всех контроллеров.