我正在使用.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
答案 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
}