【发布时间】: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