Получить тип реализации во время внедрения зависимостей ядра ASP.Net - PullRequest
0 голосов
/ 08 июля 2019

Как внедрить тип класса в одну из его зависимостей, используя встроенное внедрение зависимостей ASP.Net?

В Startup.Configure у меня есть:

services.AddTransient<ILogger>(x => new Logger(???));

И мой класс принимает экземпляр Logger

public class ExampleController : ControllerBase
{
    public Example(ILogger logger)
    {
        ...
    }
}

Конструктор Logger должен получить typeof (Пример), где я написал «???», за исключением того, что это должно работать для всех классов, которые получают регистратор.

Вопрос очень похож на this , но я использую внутренний интерфейс ILogger и класс Logger, а не использую ninject. Я фактически не хочу дублировать "context.Request.ParentContext.Plan.Type" объекта в другом вопросе.

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

Я предполагаю, что вы используете Microsoft.Extensions.Logging. При этом, по крайней мере, нет необходимости регистрировать что-нибудь . Регистрация уже настроена с помощью вызова на CreateDefaultBuilder() в Program.cs. Самое большее, что вам нужно сделать, это добавить альтернативных / дополнительных провайдеров журналов, но это конфигурация. Вы бы никогда не назвали что-то вроде services.AddTransient с ILogger.

Вместо этого вы обрабатываете параметр типа интерфейса ILogger через параметр, который вы используете для его внедрения:

public class Example
{
    public Example(ILogger<Example> logger)
    {
        ...
    }
}

Вы по-прежнему можете хранить его в простом ILogger иваре, без универсального типа, но для параметра, который вы вводите, необходимо указать тип параметра.

В качестве альтернативы, если вы ищете что-то более гибкое, вы можете вместо этого ввести ILoggerFactory, а затем использовать GetType() для предоставления типа:

public class Example
{
    private readonly ILogger _logger;

    public Example(ILoggerFactory loggerFactory)
    {
        _logger = _loggerFactory.CreateLogger(GetType())
    }
}
1 голос
/ 08 июля 2019

Одно из доступных решений:

Инициализируйте ваш регистратор (NLog, Log4Net, you-name-it) следующим образом:

WebHost.ConfigureLogging((context, builder) => ...init your logger engine here...)

Затем используйте универсальную версию ILogger <>вместо просто типа ILogger:

public class Example
{
    public Example(ILogger<Example> logger)
    {
        ...
    }
}

Надеюсь, это поможет.

...