Как написать метод расширения, который позволяет вам устанавливать параметры, не создавая экземпляр параметров - PullRequest
1 голос
/ 27 сентября 2019

Мне действительно нравится шаблон, в котором я могу настроить сервис через класс параметров без необходимости его создания, но я не могу найти пример того, как написать метод расширения, который позволяет мне использовать тот же шаблон, такой какниже показано, что существует для регистрации 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;
    }
}

1 Ответ

0 голосов
/ 28 сентября 2019

ASP.NET Core предоставляет этот механизм с интерфейсом IConfigureOptions.Вы реализуете этот интерфейс в классе конфигурации и используете его для настройки объекта IOptions любым удобным вам способом.

Это так же просто, как:

   public class MyServiceConfiguration : IConfigureOptions<MyServiceOptions>
   {
       private MyServiceOptions _options;
       public MyServiceConfiguration(IOptions<MyServiceOptions> options)
       {
           _options = options.Value;
       }

       public void Configure(MyServiceOptions options)
       {
           options.SomeSetting = _options.SomeSetting;
           options.SomeOtherSetting = _options.SomeOtherSetting;
       }
   }

Все этоОсталось зарегистрировать эту реализацию в контейнере DI.

Be careful! Объект ConfigureMyServiceOptions зарегистрирован как одноэлементный, поэтому он будет захватывать любые внедренные службы с ограниченным или кратковременным временем жизни.

...