我正在为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实例作为参数添加到方法中。
发布于 2017-08-21 07:34:17
根据注释,我已将扩展方法更改为以下内容,以便由应用程序的编写器为我的选项提供配置部分。
public static IServiceCollection AddApi(this IServiceCollection services, IConfiguration databaseConfiguration)
{
services.Configure<DatabaseOptions>(databaseConfiguration);
}从StartUp类中,调用看起来像
public void ConfigureServices(IServiceCollection services)
{
services.AddApi(Configuration.GetSection("Database"));
services.AddMvc();
}以这种方式使用它的决定主要是由这些评论决定的。在开发许多开发人员使用的组件时,这种方式可能比在应用程序中使用的内部组件更相关。还有官方文件指南解释了相同的方法
从任何地方访问IConfiguration都是一个错误的设计,除了在复合根( ASP.NET核心的启动类)之外,因为这意味着配置文件必须有一个不能更改的特定结构。相反,我会编写一个扩展方法来配置组合根目录中的配置类,并将一个.Configure(Configuration.GetSection("MyLibConfig").对象传递给它,类似于.Configure(Configuration.GetSection(“MyLibConfig”).这样,从组件中组合应用程序的开发人员就可以决定将其放置在appsettings.json中的位置。 或者,当两个库直接引用IConfiguration并在配置中有相同的部分时,您将如何解决冲突?即JsonSettings却有着完全不同的结构?它只能通过让组成它的开发人员选择并将节名传递给通过.Configure设置选项的扩展方法来解决。
发布于 2020-06-18 09:22:33
要从IConfiguration获得IServiceCollection,为什么不直接解决依赖关系呢?
IConfiguration configuration = services.BuildServiceProvider().GetService<IConfiguration>();发布于 2017-08-18 07:58:50
我创建了自己的“服务集合”类型,它包装了IServiceCollection和IConfiguration,所有模块都使用该类型注册它们的服务。例如:
public interface IMyServiceCollection
{
public IServiceCollection Services { get; set; }
public IConfiguration Configuration { get; set; }
}
public static void AddFooModule(this IMyServiceCollection myServices)
{
var services = myServices.Services;
var config = myServices.Configuration;
}然后,您必须创建一个以配置实例为参数的扩展方法,该方法创建IMyServiceCollection的实现,如:
public static IMyServiceCollection CreateServiceCollection(this IServiceCollection services, IConfiguration config)
{
return new MyServiceCollection
{
Services = services,
Configuration = config
};
}请注意,我们使用的是一个模块化框架。对于简单的应用程序来说,这太过分了。
我认为你的解决方案也很好。但是,如果您经常需要访问IConfiguration实例,您可能会发现在服务集合中一遍又一遍地搜索它有点繁琐。
https://stackoverflow.com/questions/45751017
复制相似问题