我正在.NET Core中将一个服务注册为单例。但我发现该单例的构造函数被调用了多次。
services.AddSingleton<DbAuthorizationOptions, ContextAuthorizationOptions>();
我的上下文授权选项只是实体类型到IValidators
的字典,这些上下文授权选项通过DBContext
传递,以自动运行验证。
在注册我的服务时,我还使用DI注册了动态验证器。
var useDynamicValidator = serviceOption.ValidatorOptions != null;
if(useDynamicValidator)
{
//TODO: Extract this to before the register service no sense in building the provider each time
//TODO: Make this cleaner don't be dependent on Authorization options
var provider = services.BuildServiceProvider();
var authOptions = provider.GetService<DbAuthorizationOptions>();
var validator = BuildDynamicValidatorFactory(serviceOption).Invoke(provider, null);
authOptions.ValidatorOptions.AddValidatorForSet(validator);
}
我注意到当我在提供程序上调用GetService
时,我收到了一个新的单例而不是现有的单例。是否建立提供程序会创建新的容器,使得所有服务都重新注册?
如果是这样,那么我如何调用一个方法将我的动态验证器注册到现有的单例容器中的IServiceProvider
,是否有一种方法可以在服务容器构建后调用一次注册方法?
authOptions
并且它是单例的,那么您应该能够在任何服务中访问它。因此,在运行时,您可以构建工厂并添加验证。我不确定serviceOption
来自哪里,所以您需要通过构造函数注入它或将其作为方法参数传递。如果这没有意义,您可能需要编辑问题以提供有关设置的更多上下文(更好的方法是,由于这似乎是一个XY问题,请提出一个新问题)。 - NightOwl888IServiceProvider
的答案可以解决你的非单例问题,但这是“服务定位器”反模式,通常应该避免使用。 - McGuireV10