当前位置: 首页 > 知识库问答 >
问题:

如何解决配置服务中的IOptions实例?

幸弘扬
2023-03-14

是否可以解析IOptions的实例

不要使用选项

您可以使用serviceCollection手动创建服务提供程序。BuildServiceProvider()但这会导致警告:

从应用程序代码调用“BuildServiceProvider”会导致创建一个额外的单例服务副本。考虑诸如依赖注入服务之类的选项作为“配置”参数。

我怎样才能做到这一点?

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(
        configuration.GetConfigurationSection(nameof(AppSettings)));

    // How can I resolve IOptions<AppSettings> here?
}

共有3个答案

史劲
2023-03-14

所有其他答案都告诉您手动构建iSeries Provider以获得IOPS

从应用程序代码调用“BuildServiceProvider”会导致创建一个额外的单例服务副本。考虑诸如依赖注入服务之类的选项作为“配置”参数

正确的方法是实现这一点,它可以在所有版本的ASP中安全可靠地工作。NET的核心,是实现IConfigureOptions

例如,您希望添加一个自定义模型验证器,该验证器依赖于应用程序的其他服务之一。起初,这似乎是不可能的——没有办法解决IMyServiceDependency,因为您无法访问iSeries Provider

public class MyModelValidatorProvider : IModelValidatorProvider
{
    public MyModelValidatorProvider(IMyServiceDependency dependency)
    {
        ...
    }
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
    });
}

但是的魔力

public class ConfigureMvcOptions : IConfigureOptions<MvcOptions>
{
    private IMyServiceDependency _dependency;

    public MyMvcOptions(IMyServiceDependency dependency)
        => _dependency = dependency;

    public void Configure(MvcOptions options)
        => options.ModelValidatorProviders.Add(new MyModelValidatorProvider(_dependency));
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    ...

    // or scoped, or transient, as necessary for your service
    services.AddSingleton<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
}

本质上,您将在ConfigreServices中的Add***(***Options)委托中完成的任何设置现在都移动到您的IConfigreOptions

要了解更多细节,以及关于这在幕后是如何工作的信息,我建议你去看看一直优秀的安德鲁·洛克。

公良向阳
2023-03-14

实例化依赖于其他服务的类的最佳方法是使用为您提供IServiceProvider的addXXX重载。这样就不需要实例化中间服务提供程序

以下示例显示了如何在AddSingleton/AddTransient方法中使用此重载。

services.AddSingleton(serviceProvider =>
{
    var options = serviceProvider.GetService<IOptions<AppSettings>>();
    var foo = new Foo(options);
    return foo ;
});


services.AddTransient(serviceProvider =>
{
    var options = serviceProvider.GetService<IOptions<AppSettings>>();
    var bar = new Bar(options);
    return bar;
});
尹弘壮
2023-03-14

如果需要使用服务提供商手动解析服务,可以使用以下AddSingleton/AddScoped/AddTransient重载:

// Works for AddScoped and AddTransient as well
services.AddSingleton<IBarService>(sp =>
{
    var fooService = sp.GetRequiredService<IFooService>();
    return new BarService(fooService);
}

如果确实需要,可以使用IServiceCollection上的BuildServiceProvider()方法构建中间服务提供程序:

public void ConfigureService(IServiceCollection services)
{
    // Configure the services
    services.AddTransient<IFooService, FooServiceImpl>();
    services.Configure<AppSettings>(configuration.GetSection(nameof(AppSettings)));

    // Build an intermediate service provider
    var sp = services.BuildServiceProvider();

    // Resolve the services from the service provider
    var fooService = sp.GetService<IFooService>();
    var options = sp.GetService<IOptions<AppSettings>>();
}

你需要Microsoft。扩展。依赖注入包。

但是,请注意,这会导致多个服务提供商实例,这反过来可能会导致多个单例实例。

如果只需要绑定ConfigureServices中的一些选项,也可以使用bind方法:

var appSettings = new AppSettings();
configuration.GetSection(nameof(AppSettings)).Bind(appSettings);

此功能可通过Microsoft的获得。扩展。配置活页夹包装。

 类似资料:
  • 我正在尝试使用Tensorflow服务项目为HDFS的Tensorflow模型提供服务。 我正在运行tenorflow服务docker容器标签1.10.1https://hub.docker.com/r/tensorflow/serving 我可以看到tensorflow/serving repo在 https://github.com/tensorflow/serving/blob/628702

  • 配置代理服务器能干嘛 NEI toolkit 提供了代理服务器的功能,帮助将接口代理到NEI官网或者特定的服务器上 将接口代理到NEI官网 开启该功能只需将server.config.js中的online设为true, 那么对Mock Server的所有请求都将会代理到NEI官网上,该模式也被称为在线模式。 启用在线模式可以减少执行nei update的操作,在频繁更改官网数据的情况下能够大幅加快

  • opensource解析服务器是否包含用于配置新解析实例的模式API?我试图消除手动创建应用程序的需要。 这是通过parse.com http://blog.parse.com/announcements/create-parse-apps-with-the-new-apps-api/提供的模式API

  • 本文向大家介绍详解Nginx如何配置Web服务器的示例代码,包括了详解Nginx如何配置Web服务器的示例代码的使用技巧和注意事项,需要的朋友参考一下 概述 今天主要分享怎么将NGINX配置作为Web服务器,并包括以下部分: 设置虚拟服务器 配置位置 使用变量 返回特定状态码 重写HTTP响应 在高层次上,将NGINX配置作为Web服务器有一些问题需要了解,定义它处理哪些URL以及如何处理这些UR

  • 我正在使用Eclipse Juno,并且通过windows安装程序在我的PC中安装了Apache Tomcat/8.0.0-RC5。当我尝试在Eclipse中定义新服务器时,在Apache下,我没有Tomcat v8.0选项。它在Tomcat v7.0停止。如何让Apache Tomcat v8.0在Eclipse中运行?

  • 就在最近,上下文。getResources()。updateConfiguration()在Android API 25中已被弃用,我需要更改用户选择的应用程序的语言。我正在使用此方法更改语言 但由于受到了不推荐的api警告,我刚刚开始android开发。因此,任何建议都将有助于解决此警告。