你如何在静态方法中注入 IConfiguration 对象的 dotnet 核心项目?
How do you inject in dotnet core project in static method an IConfiguration object?
我有一个类似于 this one 的 Redis 存储。我的问题是,因为我使用的是 .Net Core,在第 15 行,我应该使用我通常在构造函数中注入的配置对象。
但是,不能在静态构造函数中注入配置对象,因为静态构造函数在 C# 中应该是无参数的。
我尝试添加一个静态方法来初始化配置对象,但随后构造函数抛出 NullReferenceException
因为显然 ctor 仍然首先被调用,在 Init 方法之前,它需要配置对象...那怎么办?
似乎不是一个好的解决方法。
我建议您转向较新的模式并正确使用 DI,而不是使用静态来完成所有工作并尝试让它工作(提示:它永远不会使用静态构造函数)。 =14=]
如果你真的不需要懒惰,这就像注入一样简单 IConnectionMultiplexer
:
services.AddScoped<IConnectionMultiplexer>(s => ConnectionMultiplexer.Connect(configuration["someSettings"]));
如果你确实需要懒惰:
// public interface IRedisStore { IConnectionMultiplexer RedisConnection { get; } }
public class RedisStore : IRedisStore
{
private readonly Lazy<ConnectionMultiplexer> LazyConnection;
public RedisStore(IConfiguration configuration)
{
var configurationOptions = new ConfigurationOptions
{
EndPoints = { configuration["someSettings"] }
};
LazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(configurationOptions));
}
public IConnectionMultiplexer RedisConnection => LazyConnection.Value;
}
你会注入它:
services.AddScoped<IRedisStore, RedisStore>());
我有一个类似于 this one 的 Redis 存储。我的问题是,因为我使用的是 .Net Core,在第 15 行,我应该使用我通常在构造函数中注入的配置对象。
但是,不能在静态构造函数中注入配置对象,因为静态构造函数在 C# 中应该是无参数的。
我尝试添加一个静态方法来初始化配置对象,但随后构造函数抛出 NullReferenceException
因为显然 ctor 仍然首先被调用,在 Init 方法之前,它需要配置对象...那怎么办?
似乎不是一个好的解决方法。
我建议您转向较新的模式并正确使用 DI,而不是使用静态来完成所有工作并尝试让它工作(提示:它永远不会使用静态构造函数)。 =14=]
如果你真的不需要懒惰,这就像注入一样简单 IConnectionMultiplexer
:
services.AddScoped<IConnectionMultiplexer>(s => ConnectionMultiplexer.Connect(configuration["someSettings"]));
如果你确实需要懒惰:
// public interface IRedisStore { IConnectionMultiplexer RedisConnection { get; } }
public class RedisStore : IRedisStore
{
private readonly Lazy<ConnectionMultiplexer> LazyConnection;
public RedisStore(IConfiguration configuration)
{
var configurationOptions = new ConfigurationOptions
{
EndPoints = { configuration["someSettings"] }
};
LazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(configurationOptions));
}
public IConnectionMultiplexer RedisConnection => LazyConnection.Value;
}
你会注入它:
services.AddScoped<IRedisStore, RedisStore>());