在我的上注册实例后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,该 IServiceCollection 可以随着时间的推移而更改,添加更多元素,最后您指向相同的引用。
public static ServiceProvider BuildServiceProvider(this IServiceCollection services)
{
return BuildServiceProvider(services, ServiceProviderOptions.Default);
}
那么为什么我需要再次调用它来获取一个知道如何解析我的服务的新实例呢?
为了避免混淆,Register 方法是我创建的扩展,但在内部它调用 AddSingleton 或 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;
}