繁体   English   中英

ASP.NET Core 2.x-代理服务提供商

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM