![](/img/trans.png)
[英]ASP.NET Core 2.x Register service that requires IConfigurationRoot - cannot access configuration data
[英]ASP.NET Core 2.x - Proxy Service Provider
我正在尝试为ASP.NET Core 2.x应用程序构建DI代理。 我的理解是,您可以通过在ConfigureServices方法中返回IServiceProvider实例来做到这一点,例如
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
return new ProxyServiceProvider(services);
}
以下是代理的示例。
internal class ProxyServiceProvider : IServiceProvider, ISupportRequiredService
{
private IServiceProvider ServiceProvider;
public ProxyServiceProvider(IServiceCollection serviceCollection)
{
ServiceProvider = serviceCollection.BuildServiceProvider();
}
public object GetRequiredService(Type serviceType)
{
return GetService(serviceType);
}
public object GetService(Type serviceType)
{
if (serviceType == typeof(IValuesService))
{
return new ValuesService();
}
return ServiceProvider.GetService(serviceType);
}
}
对于通过服务集合注册的服务,此实现效果很好,但是令人惊讶的是,该框架从未为IValuesService调用GetService。
[HttpGet]
public IEnumerable<string> Get([FromServices]IValuesService service)
{
return service.GetAll();
}
上面的代码在尝试创建ValuesController实例时会引发未处理的异常。
Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ServicesModelBinder.BindModelAsync(ModelBindingContext bindingContext)
Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder+<BindModelAsync>d__6.MoveNext()
...
如果我通过services.AddScoped<IValuesService, ValuesService>()
注册服务services.AddScoped<IValuesService, ValuesService>()
实例将被解析,但是我的代理上的GetService方法将被完全绕过。
看起来其他东西控制实例解析度。 我在这里想念什么?
试试这个可能对您有帮助
services.addsingleton<Ivalueservices, valueservices>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.