首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从IConfiguration获得ServiceCollection

从IConfiguration获得ServiceCollection
EN

Stack Overflow用户
提问于 2017-08-18 07:34:23
回答 3查看 18.6K关注 0票数 31

我正在为ServiceCollection编写自己的扩展方法,以注册我的模块的类型,我需要从集合中访问IConfiguration实例来注册我的选项。

可拓方法

代码语言:javascript
运行
复制
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实例作为参数添加到方法中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-21 07:34:17

根据注释,我已将扩展方法更改为以下内容,以便由应用程序的编写器为我的选项提供配置部分。

代码语言:javascript
运行
复制
public static IServiceCollection AddApi(this IServiceCollection services, IConfiguration databaseConfiguration)
{  
  services.Configure<DatabaseOptions>(databaseConfiguration);
}

从StartUp类中,调用看起来像

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services)
{
  services.AddApi(Configuration.GetSection("Database"));
  services.AddMvc();
}

以这种方式使用它的决定主要是由这些评论决定的。在开发许多开发人员使用的组件时,这种方式可能比在应用程序中使用的内部组件更相关。还有官方文件指南解释了相同的方法

从任何地方访问IConfiguration都是一个错误的设计,除了在复合根( ASP.NET核心的启动类)之外,因为这意味着配置文件必须有一个不能更改的特定结构。相反,我会编写一个扩展方法来配置组合根目录中的配置类,并将一个.Configure(Configuration.GetSection("MyLibConfi‌​g").对象传递给它,类似于.Configure(Configuration.GetSection(“MyLibConfi‌​g”).这样,从组件中组合应用程序的开发人员就可以决定将其放置在appsettings.json中的位置。 或者,当两个库直接引用IConfiguration并在配置中有相同的部分时,您将如何解决冲突?即JsonSettings却有着完全不同的结构?它只能通过让组成它的开发人员选择并将节名传递给通过.Configure设置选项的扩展方法来解决。

票数 10
EN

Stack Overflow用户

发布于 2020-06-18 09:22:33

要从IConfiguration获得IServiceCollection,为什么不直接解决依赖关系呢?

代码语言:javascript
运行
复制
IConfiguration configuration = services.BuildServiceProvider().GetService<IConfiguration>();
票数 13
EN

Stack Overflow用户

发布于 2017-08-18 07:58:50

我创建了自己的“服务集合”类型,它包装了IServiceCollectionIConfiguration,所有模块都使用该类型注册它们的服务。例如:

代码语言:javascript
运行
复制
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的实现,如:

代码语言:javascript
运行
复制
public static IMyServiceCollection CreateServiceCollection(this IServiceCollection services, IConfiguration config)
{
    return new MyServiceCollection 
    { 
        Services = services,
        Configuration = config
    };
}

请注意,我们使用的是一个模块化框架。对于简单的应用程序来说,这太过分了。

我认为你的解决方案也很好。但是,如果您经常需要访问IConfiguration实例,您可能会发现在服务集合中一遍又一遍地搜索它有点繁琐。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45751017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档