Используя LightInject, как я могу зарегистрировать универсальный сервис с фабричным методом? - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу настроить регистратор, который регистрирует результаты теста xUnit и должен заменить все зависимости ILogger<T>.Насколько я могу судить, способ решить эту проблему - использовать универсальный сервис с фабричным методом.

При использовании Microsoft.Extensions.DependencyInjection я могу сделать следующее:

services.AddTransient(typeof(ILogger<>), 
  factory => factory.GetRequiredService<LoggerFactory>().CreateLogger("TestLogger"));

Как мне добиться того же, используя LightInject?

РЕДАКТИРОВАТЬ: Мой пример не работает, потому что созданный регистратор не может быть приведен к ILogger<T>.Вместо этого я разместил свой обходной путь как решение ниже.

1 Ответ

0 голосов
/ 25 апреля 2018

Оказывается, мне пришлось решить мою проблему другим способом:

  1. Я скопировал более XunitLogger из Microsoft.Extensions.Logging.Testing
  2. Я создал универсальную версию:

    public class XunitLogger<T> : XunitLogger, ILogger<T>
    {
        public XunitLogger(ITestOutputHelper output) : base(output, typeof(T).Name, LogLevel.Information)
        {
        }
    }
    
  3. Я зарегистрировал вспомогательный тестовый выход и регистратор:

    public TestBase(ITestOutputHelper testOutputHelper)
    {
        Container.RegisterInstance(testOutputHelper);
        Container.Register(typeof(ILogger<>), typeof(XunitLogger<>));
    }
    

Ключевым моментом здесь было то, что ILogger<T> должен быть реализован универсальным классом, например XunitLogger<T>.Теперь сообщения заносятся в мой тестовый вывод.

...