.NET Core中对静态方法的依赖注入

时间:2019-05-27 23:10:22

标签: c# asp.net-core dependency-injection

我在启动时已在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在这里由于null而失败。我了解这个问题,因为我没有正确注射它。在不实例化对象的情况下以静态方法使用它怎么注入?

1 个答案:

答案 0 :(得分:2)

您不能注入静态构造函数。您有两种选择:

1。)将ILogger传递到方法中,希望调用代码已被注入。

2。)在ILogger上为ProfileContent拥有一个静态属性,然后在Startup文件的Configure方法中对其进行初始化,即

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

然后在您的静态方法中使用Logger。就个人而言,我会选择选项1。