Упрощенный подход к 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
}
}