我在appsettings.json文件中有包含变量的代码,因此我通过configure方法在IServiceCollection中注册了所有选项:
public static void Configure(IServiceCollection services, IConfiguration configuration, bool useHangfire = true)
{
services
.Configure<AuthSettings>(configuration.GetSection(AuthSettings.SectionName))
.Configure<CacheSettings>(configuration.GetSection(CacheSettings.SectionName))
..... and so on
例如,我想创建一个基类(抽象)或接口
public interface ISettings
{
public const string SectionName = "DefaultSettings";
}
public class AuthSettings: ISettings
{
public const string SectionName = "AuthSettings";
public int ConfirmCodeLength { get; set; }
public string AllowedChars { get; set; }
public TimeSpan ConfirmCodeExpiry { get; set; }
}
并像这样配置所有设置
foreach (var type in
Assembly.GetAssembly(typeof(ISettings)).GetTypes()
.Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(ISettings))))
{
var currentSettings = (ISettings)Activator.CreateInstance(type);
services.ConfigureOptions(currentSettings);
}
我已经做了同样的注册hangfire作业,但这个案例看起来有点不同。不幸的是,这个版本不工作,因为currentSetting应该implenetn IConfigureOptions,但它没有。而且我不确定这个代码从JSON中获取值。有人做了这样的事情吗?
2条答案
按热度按时间mwngjboj1#
因此,如果您有许多设置,您可以为所有设置创建基类,该基类具有定义节名称的方法
和许多这样的设置类
然后在ServiceCollection扩展类中设置方法以查找所有继承的类并将其添加到IServiceCollection
最后,您可以在StartUp类中使用此方法
wkyowqbh2#
这里的答案帮助我使我的解决方案工作起来,但是我发现了另一种方法,在.NET中使用动态类型创建类的示例,并将动态示例传递给扩展方法,以便在运行时解析参数的类型。这使用实际的
Configure<T>
方法而不是反射来调用该方法。