.I core DI, используйте значение из одной зависимости, чтобы зарегистрировать другую зависимость - PullRequest
0 голосов
/ 10 января 2019

Я использую .net core 2.1, и у меня возникает ситуация, когда я регистрирую службу в собственном контейнере IoC, и мне нужно значение из этого значения для регистрации другого набора служб

var hostBuilder = new HostBuilder()
    .ConfigureServices((hostContext, services) => 
    {
        services
        .AddSingleton<IFirstService, FirstService>()
        .AddMyServices(FirstService.MyProperty);
    });

Где AddMySerivces - это расширение IServiceCollection, которое я использую для регистрации некоторых других зависимостей, таких как

public static IServiceCollection AddMyServices(
    this IServiceCollection serviceCollection, string myProperty)
{
    // user myProperty here to register other things
}

Какой хороший способ получить, что FirstService.MyProperty перешло в AddMyServices

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Как насчет:

public static IServiceCollection AddMyServices(this IServiceCollection serviceCollection)
{
    serviceCollection.AddTransient<ISomeService>(sp =>
    {
        var firstService = sp.GetRequiredService<IFirstService>() as FirstService;
        var firstProperty = firstService.FirstProperty;

        // Build an instance of ISomeService based on the property
    });
}

Регистрирует фабрику для зависимости, где она зависит от первого сервиса. Конечно, вам нужно сделать это для каждой службы: /

Вы также можете добавить свою собственность в интерфейс IFirstService, чтобы вам не приходилось использовать службу.

0 голосов
/ 10 января 2019

Вы можете получить зарегистрированный сервис от IServiceCollection следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IFirstService, FirstService>();

    var serviceProvider = services.BuildServiceProvider();
    var firstService = serviceProvider.GetService<IFirstService>();
    // now pass firstService to AddMyServices method or get that directly in it
}
...