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

时间:2019-01-10 06:23:05

标签: c# .net asp.net-core dependency-injection .net-core

我正在使用.net core 2.1,并且遇到一种情况,我正在使用本机IoC容器注册服务,并且需要从中获得一个值来注册另一组服务

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

AddMySerivcesIServiceCollection的扩展,我用它来注册其他类似的依赖项

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

如何将FirstService.MyProperty传递到AddMyServices

2 个答案:

答案 0 :(得分:6)

怎么样:

@RunWith(RobolectricTestRunner::class)
class ViewModelOnClearedTest {
    @Test
    fun `MyViewModel#onCleared calls Object#function`() = mockkObject(Object) {
        val controller = Robolectric.buildActivity(FragmentActivity::class.java).setup()

        ViewModelProviders.of(controller.get()).get(MyViewModel::class.java)

        controller.destroy()

        verify { Object.function() }
    }
}

class MyViewModel : ViewModel() {
    override fun onCleared() = Object.function()
}

object Object {
    fun function() {}
}

这将为工厂注册依赖项,该依赖项依赖于第一个服务。 当然,您需要为每个服务执行此操作:/

您还可以将您的媒体资源添加到IFirstService接口,这样就无需强制投放服务。

答案 1 :(得分:0)

您可以像这样从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
}
相关问题