【发布时间】:2018-01-26 19:23:15
【问题描述】:
我正在为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 实例作为参数添加到方法中。
【问题讨论】:
-
显式依赖应该直接注入到需要的地方。否则会使代码产生误导。不过,如前所述,如果您将其直接注入方法中会更好。
-
恕我直言,从组合根内部(ASP.NET 核心的
Startup类)以外的任何地方访问IConfiguration是一个糟糕的设计,因为这意味着配置文件必须具有特定的结构根本无法改变。相反,我会编写一个扩展方法来配置组合根内的配置类并将IConfiguration对象传递给,类似于.Configure<MyLibConfig>(Configuration.GetSection("MyLibConfig")。这样,从您的组件组成他的应用程序的开发人员可以决定将其放置在 appsettings.json 中的哪个位置 -
或者,当两个库直接引用
IConfiguration并且在配置中具有相同的部分时,您将如何解决冲突?即JsonSettings,但结构完全不同?它只能通过让编写它的开发人员选择并将部分名称传递给您的扩展方法来解决,该方法通过.Configure<T>设置选项 -
对我不起作用,因为
ImplementationInstance为空。不得不打电话给.ImplementationFactory(null)。工作,但当然很脏。
标签: c# asp.net-core asp.net-core-2.0 asp.net-core-configuration