2017-08-13 22 views
0

コンテキスト:ASP.NET Core App(1.1)。Autofac&MassTransit - Consumer ObjectDisposedExceptionを登録します。

私はコンシューマーインスタンスが必要なときに既に登録したIRepositoryを解決しようとしますが、ObjectDisposedExceptionが表示されるようです。

BusFactoryMethod

私は私が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; 
} 
+1

が、あなたの':

public class DefaultModule : Autofac.Module { protected override void Load(ContainerBuilder containerBuilder) { containerBuilder.Register(c => new EventTypeResolver(typeof(DefaultModule).GetTypeInfo().Assembly)).As<IEventTypeResolver>(); containerBuilder.Register(c => EventStoreConnectionFactory.Create()) .As<IEventStoreConnection>(); containerBuilder.RegisterType<Repository>().As<IRepository>(); containerBuilder.RegisterConsumers(typeof(DefaultModule).GetTypeInfo().Assembly).AsSelf().AsImplementedInterfaces(); containerBuilder.RegisterGeneric(typeof(AutofacConsumerFactory<>)) .WithParameter(new NamedParameter("name", "message")) .As(typeof(IConsumerFactory<>)) .InstancePerLifetimeScope(); containerBuilder.Register((c) => { var busControl = BusConfigurator.Instance.ConfigureBus((cfg, host) => { ConfigureEndPoints(cfg, host, c); }); busControl.Start(); return busControl; }).SingleInstance().AutoActivate(); } private void ConfigureEndPoints(IRabbitMqBusFactoryConfigurator cfg, IRabbitMqHost host, IComponentContext context) { cfg.ReceiveEndpoint(host, RabbitMQConstants.UserManagementQueue, e => { e.Consumer(context.Resolve<IConsumerFactory<CreateUserCommandConsumer>>()); }); } } 

ConfigureServices方法は、次のように探していますIBusControl'はシングルトンで、IBusControl'をどこから解決するかによって決まります。リクエスト中にどこかで解決すれば、スコープ付きコンテナで解決されますが、シングルトンからg IRepositoryがスコープ付きのコンテナによって解決され、要求の最後に配置されている間に、親コンテナに返されますが、 'IBusControl'はそのシングルトンが処理されません。 – Tseng

+0

したがって、アプリケーション起動時に' IBusControl'を解決するか'メソッドを使用するか、' IRepository'と 'IBusControl'スコープの有効期間を変更します(イベントやメッセージを聞きたいのでおそらく不可能) – Tseng

+0

Hmmm。はい、そうです.BusFactoryMethodをAutoActivateで登録すると、コンテナをビルドするときに呼び出されます。しかし、コンシューマ/リポジトリはリクエストの存続期間のためだけに存在します –

答えて

0

だから私はすでにRegisterConsumersメソッドを持つパッケージMassTransit.AutofacIntegrationを見つけました。

次に、メッセージあたりの有効期間を得るために、私はAutofacのRegisterGenericメソッドを使用しました。

containerBuilder.RegisterGeneric(typeof(AutofacConsumerFactory<>)) 
          .WithParameter(new NamedParameter("name", "message")) 
          .As(typeof(IConsumerFactory<>)) 
          .InstancePerLifetimeScope(); 

そして、次のModuleになってしまった:あなたは、過渡依存関係として、あなたの `IRepository`を登録している

public IServiceProvider ConfigureServices(IServiceCollection services) 
     { 
      var containerBuilder = new ContainerBuilder(); 
      containerBuilder.RegisterModule<DefaultModule>(); 
      containerBuilder.Populate(services); 
      return new AutofacServiceProvider(containerBuilder.Build()); 
     } 
+1

あなたは驚くかもしれませんが、Autofacアダプタについてはhttp://masstransit-project.com/MassTransit/usage/containers/autofac.htmlのドキュメントを参照してください。 –

関連する問題