上下文:ASP.NET Core App(1.1)。Autofac&MassTransit - 注册用户ObjectDisposedException
我试图解决我已经注册的IRepository,当我需要一个消费者实例时,但它看起来像我收到ObjectDisposedException。
我创造了我的呼唤了ContainerBuilder
的.Build()
方法自动激活总线工厂方法。
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<EventTypeResolver>().As<IEventTypeResolver>();
containerBuilder.RegisterType<Repository>().As<IRepository>();
containerBuilder.Register(c => EventStoreConnectionFactory.Create())
.As<IEventStoreConnection>();
containerBuilder.Register(BusFactoryMethod).AsSelf().SingleInstance().AutoActivate();
containerBuilder.Populate(services);
return new AutofacServiceProvider(containerBuilder.Build());
}
BusFactoryMethod
看起来是这样的:
private IBusControl BusFactoryMethod(IComponentContext componentContext)
{
var busControl = BusConfigurator.Instance.ConfigureBus((cfg, host) =>
{
cfg.ReceiveEndpoint(host, RabbitMQConstants.UserManagementQueue, e =>
{
e.Consumer(() => new CreateUserCommandConsumer(componentContext.Resolve<IRepository>()));
});
});
busControl.Start();
return busControl;
}
您注册你的'IRepository'为短暂的依赖,但你的' IBusControl'是个奇怪的东西,取决于你从哪里解决'IBusControl',即如果你在请求期间解决它的某个地方,它由作用域容器解决,但是因为它的单例它g当IRepository由作用域容器解析并放置在请求结束时,但是'IBusControl'不会因为它的单例而被丢弃 – Tseng
因此,在应用程序启动期间,您将不得不解决'IBusControl'配置'方法,或更改'IRepository'和'IBusControl'作用域生命周期(可能不可能,因为您想收听事件和消息) – Tseng
嗯。是的,就像我注册BusFactoryMethod和AutoActivate一样,它会在我构建容器时被调用。但是消费者/存储库仅用于请求生存期 –