我正在编写自己的扩展方法,用于ServiceCollection
来注册我的模块类型,并且需要访问集合中的IConfiguration
实例来注册我的选项。
扩展方法
public static IServiceCollection AddApi(this IServiceCollection services)
{
// Get configuration from collection
var configuration = (IConfiguration) services.FirstOrDefault(p => p.ServiceType == typeof(IConfiguration)).ImplementationInstance;
services.Configure<DatabaseOptions>(configuration.GetSection("Database"));
}
这是从集合中获取 IConfiguration
实例的正确方法吗?还是有更优雅的解决方案?我不想将 IConfiguration
实例添加为该方法的参数。
IConfiguration
都是糟糕的设计,因为这意味着配置文件必须具有特定的结构,而且无法更改。相反,我会编写扩展方法,在组合根内部配置配置类,并将IConfiguration
对象传递给它,类似于.Configure<MyLibConfig>(Configuration.GetSection("MyLibConfig")
。这样,将应用程序从您的组件组合的开发人员可以决定在appsettings.json中将其放置在哪里。 - TsengIConfiguration
并且在配置中具有相同的部分时,您将如何解决冲突?例如,JsonSettings
但具有完全不同的结构?唯一的解决方法是让编写它的开发人员选择并传递部分名称给您的扩展方法,该方法通过.Configure<T>
设置选项。 - TsengImplementationInstance
为空。只能调用.ImplementationFactory(null)
。虽然这样做有效,但显然很不好。 - PhillipM