使用RabbitMQ进行大众运输中的服务定位器模式(DI)

时间:2019-09-03 13:18:45

标签: asp.net-core dependency-injection rabbitmq masstransit service-locator

我需要在使用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

我了解“服务定位器”的反模式,但是在非常具体的上下文中,我无法使用正确的方式(构造函数)。

0 个答案:

没有答案