Внедрение зависимостей от статического метода в ASP .Net Core - PullRequest
0 голосов
/ 28 мая 2019

Я зарегистрировал реализацию моего регистратора в 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;
    }
}

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

1 Ответ

2 голосов
/ 28 мая 2019

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

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

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

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

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

...