Asp.net core 如何编写一个扩展方法,允许您在不创建选项实例的情况下设置选项

Asp.net core 如何编写一个扩展方法,允许您在不创建选项实例的情况下设置选项,asp.net-core,.net-core,extension-methods,Asp.net Core,.net Core,Extension Methods,我非常喜欢这样一种模式,即我可以通过选项类配置服务,而不必创建它,但我找不到一个示例来说明如何编写一个扩展方法,允许我使用下面的模式来注册DbContext services.AddDbContext<MyDbContext>(options => options.EnableDetailedErrors()); services.AddDbContext(options=>options.enabledDetailedErrors()); 我可以看到方法签名使用动作方法,

我非常喜欢这样一种模式,即我可以通过选项类配置服务,而不必创建它,但我找不到一个示例来说明如何编写一个扩展方法,允许我使用下面的模式来注册DbContext

services.AddDbContext<MyDbContext>(options => options.EnableDetailedErrors());
services.AddDbContext(options=>options.enabledDetailedErrors());
我可以看到方法签名使用动作方法,但我似乎在GitHub for ASP.NET Core中找不到扩展类,它向我展示了如何使用该类型的option builder模式编写扩展方法

例如,以下面的服务代码为例。如何编写扩展方法,以便在服务注册期间配置选项

public void ConfigureServices(IServiceCollection services)
{
    services.AddMyService(options => options.SomeSetting = true);
}

public interface IMyService
{
    void DoSomething();
}

public class MyService : IMyService
{
    private readonly MyServiceOptions _options;
    public MyService(IOptions<MyServiceOptions> options)
    {
        _options = options.Value;
    }
    public void DoSomething()
    {
        Console.WriteLine(_options.SomeSetting);
    }
}    
public static class MyServiceExtensions
{
    // How would I write this extension method so that I could configure it with options overload
    public static IServiceCollection AddMyService(this IServiceCollection services, Action<MyServiceOptions> configure)
    {
        services.AddSingleton<IMyService, MyService>();
        return services;
    }
}
public void配置服务(IServiceCollection服务)
{
services.AddMyService(options=>options.SomeSetting=true);
}
公共接口IMyService
{
无效剂量();
}
公共类MyService:IMyService
{
私有只读MyServiceOptions\u选项;
公共MyService(IOOptions选项)
{
_选项=选项.值;
}
公共无效剂量测定法()
{
Console.WriteLine(_options.SomeSetting);
}
}    
公共静态类MyServiceExtensions
{
//如何编写此扩展方法,以便使用选项重载对其进行配置
公共静态IServiceCollection AddMyService(此IServiceCollection服务,操作配置)
{
services.AddSingleton();
返回服务;
}
}
ASP.NET核心为该机制提供了IConfigureOptions 接口。在配置类中实现此接口,然后 使用它以任何需要的方式配置IOptions对象

这很容易:

公共类MyServiceConfiguration:IConfigureOptions
{
私人MyService选项(U选项);
公共MyServiceConfiguration(IOOptions选项)
{
_选项=选项.值;
}
公共void配置(MyServiceOptions选项)
{
options.SomeSetting=\u options.SomeSetting;
options.SomeOtherSetting=\u options.SomeOtherSetting;
}
}
剩下的就是在DI容器中注册此实现:

public void配置服务(IServiceCollection服务)
{
services.Configure(options=>options.SomeOtherSetting=true);
services.AddSingleton();
}
使用此配置,当IOptions注入到您的服务中时,MyServiceOptions对象将由ConfigureMyServiceOptions类配置

小心ConfigureMyServiceOptions对象已注册为singleton,
因此,它将捕获任何具有作用域或瞬时生命周期的注入服务


@Geekn为代码中的错误感到抱歉。我没有时间测试它,所以不知道它是否编译。谢谢你的编辑。这是否解决了您的问题?我可能没有根据您指示的内容对其进行编辑,因为我在使用配置类时遇到“检测到Microsoft.Extensions.Options.IOption类型服务的循环依赖项”异常。当我不使用configuration类而只使用Configure()时,它确实可以工作,但我可能缺少一些东西。无论如何,你的回答真的帮助了我!