【问题标题】:masstransit DI integration with asp.net core 2.0masstransit DI 与 asp.net core 2.0 的集成
【发布时间】:2018-06-27 23:12:17
【问题描述】:

我有一个托管在基于 MassTransit 的 Windows 服务上的应用程序。它针对 .net 框架 4.6.2。现在,我将它移植到 asp.net core 2.0。在 .net 框架上,我使用 autofac 的容器从指定程序集中加载消费者。现在我想使用默认的 asp.net core 的 DI。有我的启动代码:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.RegisterAllTypes<IConsumer>(new Assembly[] { Assembly.Load("consumersLib") });

            var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var host = cfg.Host(new Uri("rabbithost"), h =>{...});

                cfg.ReceiveEndpoint("queue", ec =>
                {
                    ec.LoadFrom(services.BuildServiceProvider());
                });

            });
        }

并注册:

public static void RegisterAllTypes<T>(this IServiceCollection services, Assembly[] assemblies,
        ServiceLifetime lifetime = ServiceLifetime.Transient)
        {
            var typesFromAssemblies = assemblies.SelectMany(a => a.DefinedTypes.Where(x => x.GetInterfaces().Contains(typeof(T))));
            foreach (var type in typesFromAssemblies)
                services.Add(new ServiceDescriptor(typeof(T), type, lifetime));
        }

ec.LoadFrom(services.BuildServiceProvider()) 抛出异常:“对象引用未设置为对象的实例。”,即使 services.BuildServiceProvider() 已初始化并包含一些消费者。我查看了 masstransit 的来源:

public static void LoadFrom(this IReceiveEndpointConfigurator configurator, IServiceProvider serviceProvider)
        {
            var consumerCache = serviceProvider.GetService<IConsumerCacheService>();

            var consumers = consumerCache.GetConfigurators();

            foreach (var consumer in consumers)
                consumer.Configure(configurator, serviceProvider);

            var sagaCache = serviceProvider.GetService<ISagaCacheService>();

            IEnumerable<ICachedConfigurator> sagas = sagaCache.GetConfigurators();

            foreach (var saga in sagas)
                saga.Configure(configurator, serviceProvider);
        }

我发现一行 serviceProvider.GetService() 返回 null。有人知道怎么解决吗?

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    有一个用于将 MassTransit 与 MS DI 结合使用的集成库。

    https://www.nuget.org/packages/MassTransit.Extensions.DependencyInjection/

    它也被记录在案:

    http://masstransit-project.com/MassTransit/usage/containers/msdi.html

    【讨论】:

    • 非常感谢!它帮助了我。
    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 2019-08-08
    • 2020-05-28
    • 2019-07-19
    • 2018-07-22
    • 2020-06-09
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多