如何使用ASP.NET Core MVC内置依赖注入框架手动解析类型?
设置容器很容易:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddTransient<ISomeService, SomeConcreteService>();
}
Run Code Online (Sandbox Code Playgroud)
但是如何在ISomeService不进行注射的情况下解决?例如,我想这样做:
ISomeService service = services.Resolve<ISomeService>();
Run Code Online (Sandbox Code Playgroud)
没有这样的方法IServiceCollection.
是否可以IOptions<AppSettings>从ConfigureServicesStartup中的方法解析实例?通常,您可以使用IServiceProvider初始化实例,但在注册服务时此阶段没有实例.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(
configuration.GetConfigurationSection(nameof(AppSettings)));
// How can I resolve IOptions<AppSettings> here?
}
Run Code Online (Sandbox Code Playgroud) 我正在将服务注册为.NET Core中的单例.然而,我正在看多次调用单例的构造函数.
services.AddSingleton<DbAuthorizationOptions, ContextAuthorizationOptions>();
Run Code Online (Sandbox Code Playgroud)
我的上下文授权选项只是实体类型字典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);
}
Run Code Online (Sandbox Code Playgroud)
我注意到,当我打电话GetService给提供者时,我会收到一个新的单例,而不是现有的单例.构建提供程序是否会创建一个新容器,以便重新注册所有服务?
如果是这样,我如何调用一个方法在现有的单例容器中注册我的动态验证器IServiceProvider,有没有办法在构建服务容器后调用一次注册?