我需要在使用Asp Net Core的Web应用程序中使用“服务定位器模式”,我已经成功使用该接口成功进行了HTTP通用调用
IHttpContextAcessor
。
在Web API中,我将HttpContextAcessor存储在一个静态字段中,以后可以解析作用域服务。
就像HTTP调用的魅力一样工作,但是对rabbitMq Consumers却有问题,因为HttpContext始终为Null。
我需要一个等效的类或方法将服务提供者存储在静态字段中,以在使用者中检索作用域服务。
这是我存储当前服务提供商的方式
我的界面
public interface IServiceProviderProxy
{
T GetService<T>();
object GetService(Type type);
IEnumerable<T> GetServices<T>();
IEnumerable<object> GetServices(Type type);
}
具体课程
public class WebApiServiceProviderProxy : IServiceProviderProxy
{
private readonly IHttpContextAccessor contextAccessor;
private readonly IServiceProvider serviceProvider;
public WebApiServiceProviderProxy(IHttpContextAccessor contextAccessor,
IServiceProvider serviceProvider)
{
this.contextAccessor = contextAccessor;
this.serviceProvider = serviceProvider;
}
...
然后,添加并配置为使用该代理:
services.AddSingleton<IServiceProviderProxy, WebApiServiceProviderProxy>();
...
var proxy = app.ApplicationServices.GetService(typeof(IServiceProviderProxy)) as IServiceProviderProxy;
Global.ProviderProxy = proxy;
如果HttpContext为null,则我尝试使用ServiceProvider(消费者案例),但是,存储的ServiceProvider始终具有相同的作用域,即使在不同的消费者中也从未更改。但是,使用构造函数的DI很好用
我在RabbitMq中需要一个等效的IHttpContextAcessor
我了解“服务定位器”的反模式,但是在非常具体的上下文中,我无法使用正确的方式(构造函数)。