Ядро 3.1 DI универсальный ApiController встроенный регистратор

#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 для каждого универсального подтипа. В текущем решении у меня есть один регистратор для всех контроллеров.