如何编写扩展方法,使您可以在不创建选项实例的情况下设置选项

问题描述 投票:0回答:1

我真的很喜欢这种模式,我可以通过选项类来配置服务而无需创建它,但是我找不到如何编写允许我使用相同模式的扩展方法的示例,例如下面的内容用于注册DbContext。

services.AddDbContext<MyDbContext>(options => options.EnableDetailedErrors());

[我可以看到方法签名使用了操作方法,但是我似乎在GitHub中找不到ASP.NET Core的扩展类,该扩展类向我展示了如何使用这种类型的选项构建器模式编写扩展方法。

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

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;
    }
}
asp.net-core .net-core extension-methods
1个回答
0
投票

ASP.NET Core通过IConfigureOptions提供此机制接口。您可以在配置类中实现此接口,然后使用它以您需要的任何方式配置IOptions对象。

就像这样简单:

       private class ConfigureMyServiceOptions : IConfigureOptions<MyServiceOptions>
       {
           private readonly MyServiceOptionsProvider _myServiceOptionsProvider;

           public ConfigureMyServiceOptions(IOptions<MyServiceOptions> serviceOptions)
           {
               _myServiceOptions = serviceOptions.Value;
           }

           public void Configure(MyServiceOptions options)
           {
               options.SomeOption = _myServiceOptionsProvider.CorrespondingOption;
           }
       }

剩下的就是在DI容器中注册该实现。:

    public void ConfigureServices(IServiceCollection services)
    {
         services.Configure<MyServiceOptions>(
             services.AddSingleton<IConfigureOptions<MyServiceOptions>, ConfigureMyServiceOptions>();
    }

使用此配置,当将IOptions注入到您的服务中时,将由ConfigureMyServiceOptions类配置MyServiceOptions对象。

Be careful! ConfigureMyServiceOptions对象注册为单例,因此它将捕获任何注入的服务,这些服务具有一定范围的或短暂的生命周期。

© www.soinside.com 2019 - 2024. All rights reserved.