代码之家  ›  专栏  ›  技术社区  ›  reggaemahn

.NET核心DI,使用一个依赖项的值注册另一个依赖项

  •  0
  • reggaemahn  · 技术社区  · 7 年前

    我使用的是.NET核心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 回复  |  直到 7 年前
        1
  •  5
  •   juunas    7 年前

    怎么样:

    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接口,这样就不需要强制转换服务。

        2
  •  0
  •   Moien Tajik    7 年前

    您可以从ISeviceCollection获得注册服务,如下所示:

    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
    }
    
    推荐文章