コンテキスト:ASP.NET Core App(1.1)。Autofac&MassTransit - Consumer 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;
}
が、あなたの':
ConfigureServices
方法は、次のように探していますIBusControl'はシングルトンで、IBusControl'をどこから解決するかによって決まります。リクエスト中にどこかで解決すれば、スコープ付きコンテナで解決されますが、シングルトンからg IRepositoryがスコープ付きのコンテナによって解決され、要求の最後に配置されている間に、親コンテナに返されますが、 'IBusControl'はそのシングルトンが処理されません。 – Tsengしたがって、アプリケーション起動時に' IBusControl'を解決するか'メソッドを使用するか、' IRepository'と 'IBusControl'スコープの有効期間を変更します(イベントやメッセージを聞きたいのでおそらく不可能) – Tseng
Hmmm。はい、そうです.BusFactoryMethodをAutoActivateで登録すると、コンテナをビルドするときに呼び出されます。しかし、コンシューマ/リポジトリはリクエストの存続期間のためだけに存在します –