Внедрение зависимостей в статический метод в ASP .Net Core

Я зарегистрировал реализацию своего регистратора в ServiceCollection при запуске:

services.AddTransient(typeof(ILogger<>), typeof(GenericLogger<>));

Обычно я делаю это для внедрения с помощью конструктора:

class DynamoEventProcessor
{
    private readonly IRepository _repository;
    private readonly IDogStatsd _dogStatsd;
    private readonly ILogger<DynamoEventProcessor> _logger;

    public DynamoEventProcessor(IRepository repository, IDogStatsd dogStatsd, ILogger<DynamoEventProcessor> logger)
    {
        _repository = repository;
        _dogStatsd = dogStatsd;
        _logger = logger;
    }
}

Но у меня есть класс, в котором нет конструктора:

public class ProfileContent
{
    public MemoryStream Content { get; set; }
    public string ContentAlgorithm { get; set; }
    public List<Dictionary<string, AttributeValue>> DataKeys { get; set; }
    public long ExpiresUtc { get; set; }
    public long Version { get; set; }
    public long Deleted { get; set; }

    public static Dictionary<string, EncryptedDataAndKeys> GetEncryptedDataAndKeys(Dictionary<string, Dictionary<string, AttributeValue>> profileContentAttributes)
    {
        _logger.LogInformation("Available Keys: " + KeysAsString(keyList));
        _logger.LogInformation("AccountId missing Coporate Data: " + _converter.GetValueFromAttributeValue(attributes["AccountId"]).ToString());
        var encryptedDataAndKeys = new Dictionary<string, EncryptedDataAndKeys>();

        foreach (var item in profileContentAttributes)
        {
            encryptedDataAndKeys.Add(item.Key, GetEncryptedDataAndKey(item.Value));
        }

        return encryptedDataAndKeys;
    }
}

Мой _logger потерпел неудачу здесь из-за нуля. Я понимаю проблему, что я не ввел его должным образом. Как я могу внедрить его, когда я использую его в статическом методе без создания экземпляра объекта?

Я бы сделал статический метод сервисом (возможно, синглтоном) и зарегистрировал его в контейнере. Другим решением было бы передать необходимую услугу в качестве параметра. Если вы действительно хотите пойти тем же путем, что и сейчас, вам нужен сервисный локатор, то есть не рекомендуется.

Christian Gollhardt 28.05.2019 01:47

Возможный дубликат Как использовать DI внутри статического метода в Asp.net Core rc1

Christian Gollhardt 28.05.2019 01:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
7 894
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете внедрить в статический конструктор. У вас есть несколько вариантов:

1.) Передайте ILogger в метод, надеюсь, вызывающий код внедрил его.

2.) Иметь статическое свойство для ILogger в ProfileContent, а затем в вашем файле Startup в методе Configure инициализировать его, т.е.

ProfileContent.Logger = app.ApplicationServices.GetService<ILogger<ProfileContent>>();

затем используйте Logger в своем статическом методе. Лично я бы остановился на варианте 1.

Единственное, что я мог бы добавить к этому: 3) Избавьтесь от статики, с регистрацией Singleton в DI, действительно ли этот класс должен быть статичным?

Robert Perry 28.05.2019 13:38

Вы предпочли вариант 1. Вариант 2. Для меня было намного меньше кода. В чем причина предпочтения варианта 1?

Bob Koury 06.07.2021 22:25

Вариант 2 — анти-паттерн локатора сервисов. Он также блокирует создание и назначение Logger, и, как правило, я не сторонник статических свойств.

JohanP 07.07.2021 01:39

Другие вопросы по теме