【发布时间】:2018-12-19 16:27:39
【问题描述】:
在我的IServiceCollection 上注册实例后,我需要注册一个IAutomapperProvider,它依赖于在此方法调用之前注册的IAssemblyProvider
public static IServiceCollection RegisterAutomapperConfiguration(this IServiceCollection container, ServiceLifetime lifeTime = ServiceLifetime.Scoped)
{
//creating the provider to get the IAssemblyProvider for my IAutomapperProvider
var prov = container.BuildServiceProvider();
var assemblyProvider = prov.GetService<IAssemblyProvider>();
container.Register<IAutomapperProvider>(aProv => new AutomapperProvider(assemblyProvider), lifeTime);
var autoMapperProvider = prov.GetService<IAutomapperProvider>();
var mapperConfig = autoMapperProvider.GetMapperConfiguration();
...
}
如果在container.Register<IAutomapperProvider>(aProv => new AutomapperProvider(assemblyProvider), lifeTime);的电话之后
我不再调用BuildServiceProvider,那我之前注册的IAutomapperProvider就得不到了
public static IServiceCollection RegisterAutomapperConfiguration(this IServiceCollection container, ServiceLifetime lifeTime = ServiceLifetime.Scoped)
{
//creating the provider to get the IAssemblyProvider for my IAutomapperProvider
var prov = container.BuildServiceProvider();
var assemblyProvider = prov.GetService<IAssemblyProvider>();
container.Register<IAutomapperProvider>(aProv => new AutomapperProvider(assemblyProvider), lifeTime);
prov = container.BuildServiceProvider();
var autoMapperProvider = prov.GetService<IAutomapperProvider>();
var mapperConfig = autoMapperProvider.GetMapperConfiguration();
...
}
在 AspNetCore 代码上,当您调用 BuildServiceProvider 扩展方法时,它们使用相同的 IServiceCollection,该方法会随着时间的推移而更改,添加更多元素,最后您指向的是相同的引用
public static ServiceProvider BuildServiceProvider(this IServiceCollection services)
{
return BuildServiceProvider(services, ServiceProviderOptions.Default);
}
那为什么我需要再次调用它来获取一个知道如何解析我的服务的新实例?
为避免混淆,Register 方法是我创建的一个扩展,但在内部调用了 AddSinglenton 或 Add...
public static IServiceCollection Register<TService>(this IServiceCollection container, Func<IServiceProvider, TService> implementationFactory, ServiceLifetime lifeTime)
where TService : class
{
if (container == null)
throw new ArgumentNullException(nameof(container));
if (implementationFactory == null)
throw new ArgumentNullException(nameof(implementationFactory));
switch (lifeTime)
{
case ServiceLifetime.Scoped:
container.AddScoped(typeof(TService), (Func<IServiceProvider, object>)implementationFactory);
break;
case ServiceLifetime.Transient:
container.AddTransient(typeof(TService), (Func<IServiceProvider, object>)implementationFactory);
break;
default:// ServiceLifetime.Singleton
container.AddSingleton(typeof(TService), (Func<IServiceProvider, object>)implementationFactory);
break;
}
return container;
}
【问题讨论】:
-
这是XY problem。你需要澄清一些事情。这是什么
Register?那是一些外部第三方扩展吗?明确你想要达到的目标。 -
@Nkosi 你是对的,我更新了问题
标签: c# asp.net-core dependency-injection ioc-container