Упрощенный подход к IOptions<T>

Я пытаюсь привести библиотеку классов.NET Framework в соответствие с приложением ASP.NET Core 2.1, используя встроенный механизм DI. Теперь я создал класс конфигурации и добавил соответствующий раздел в appsettings.json:

services.Configure<MyConfig>(Configuration.GetSection("MyConfiguration"));
services.AddScoped<MyService>();

В классе lib:

public class MyService 
{
    private readonly MyConfig _config;

    public MyService(IOptions<MyConfig> config)
    {
        _config = config.Value;
    }
}

Тем не менее, чтобы построить эту библиотеку классов, я должен добавить Microsoft.Extensions.Options Пакет NuGet. Проблема заключается в том, что пакет содержит множество зависимостей, которые кажутся чрезмерными для добавления только ради одного интерфейса.

Итак, в конечном итоге возникает вопрос: "Есть ли другой подход, который я могу использовать для настройки службы DI, расположенной в библиотеке классов.NET Framework, которая не является тяжелой зависимостью?

3 ответа

Решение

Проверьте эту статью, написанную Филиппом Wojcieszyn.

https://www.strathweb.com/2016/09/strongly-typed-configuration-in-asp-net-core-without-ioptionst/

Вы добавляете метод расширения:

public static class ServiceCollectionExtensions
{
    public static TConfig ConfigurePOCO<TConfig>(this IServiceCollection services, IConfiguration configuration) where TConfig : class, new()
    {
        if (services == null) throw new ArgumentNullException(nameof(services));
        if (configuration == null) throw new ArgumentNullException(nameof(configuration));

        var config = new TConfig();
        configuration.Bind(config);
        services.AddSingleton(config);
        return config;
    }
}

Примените его в конфигурации:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.ConfigurePOCO<MySettings>(Configuration.GetSection("MySettings"));
}

И затем используйте это:

public class DummyService
{
    public DummyService(MySettings settings)
    {
        //do stuff
    }
}

Я столкнулся с этой проблемой некоторое время назад, если вы даже можете назвать это проблемой на самом деле. Я думаю, что мы все, как правило, немного шокированы, когда видим такой список зависимостей. Но, как упомянул @Tseng, добавление нескольких крошечных сборок на самом деле не составляет особого труда (они будут включены в bin уже в любом случае в силу ссылки в другом проекте). Но я признаю, что раздражает необходимость включать их только для интерфейса параметров.

Как я решил это, разрешив сервисную зависимость в startup.cs и соответственно скорректируйте конструктор сервиса:

services.AddTransient<MyService>(Configuration.GetConfiguration("MyConfiguration"));

Если вам все равно IOptions предоставляет вам, почему бы не просто ввести IConfiguration в ваш сервис?

public class MyService
{
    private readonly IConfiguration _config;

    public MyService(IConfiguration config)
    {
        _config = config;
    }

    public void DoSomething()
    {
        var value = _config["SomeKey"];

        // doing something
    }
}
Другие вопросы по тегам