2017-08-09 4 views
1

でのルーティングの設定を拡張するためにどのように私は多くのWeb APIプロジェクトそこで、基本的Q:REBUS

のために共有されているREBUSコンフィグプロジェクトを持って、それは次のようになります

Web APIを1 ==>共有REBUSコンフィグ

Web APIを2 ==>共有REBUSコンフィグ

Web APIを3 ==>共有REBUSコンフィグ

私の質問は、私がWeb APIの3プロジェクトで&ハンドラいくつかのメッセージを持っている場合、どのように私は彼らのためにルーティングを設定することができ、ありますか?


私の現在の設定:

var autofacContainerAdapter = new AutofacContainerAdapter(container); 

return Configure 
    .With(autofacContainerAdapter) 
    .Serialization(s => s.UseNewtonsoftJson()) 
    .Routing(r => 
    { 
     r.TypeBased() 
      .MapAssemblyOf<ProjectA.MessageA>(EnvironmentVariables.ServiceBusQueueName) 
      .MapAssemblyOf<ProjectB.MessageB>(EnvironmentVariables.ServiceBusQueueName); 
    }) 
    .Sagas(s => 
    { 
     s.StoreInSqlServer(EnvironmentVariables.ConnectionString, "Saga", "SagaIndex"); 
    }) 
    .Options(o => 
    { 
     o.LogPipeline(); 
     o.EnableDataBus().StoreInBlobStorage(EnvironmentVariables.AzureStorageConnectionString, EnvironmentVariables.BlobStorageContainerName); 
     o.EnableSagaAuditing().StoreInSqlServer(EnvironmentVariables.ConnectionString, "Snapshots"); 
    }) 
    .Logging(l => 
    { 
     l.Use(new SentryLogFactory()); 
    }) 
    .Transport(t => 
    { 
     t.UseAzureServiceBus(EnvironmentVariables.AzureServiceBusConnectionString, EnvironmentVariables.ServiceBusQueueName).AutomaticallyRenewPeekLock(); 
    }) 
    .Start(); 
+0

2つ目のWeb APIと同じように、3番目のWeb APIのルーティングを設定できないのはなぜですか? – mookid8000

+0

@ mookid8000私はいくつかのメッセージとハンドラは、3番目のWeb APIのために利用可能です –

答えて

1

うーん...あなたはおそらく既に判明しているとして、それは.Routing(r => r.TypeBased()....)部分に追加の呼び出しを行うことはできません。したがって、私は2つのかなり簡単な方法を前進させることができます:

1:追加のパラメータを外部から共有設定メソッドに渡すだけです。このような何か:

その後、 .Routing(...)設定コールバックで適切に処理する必要のあるコースの
var additionalEndpointMappings = new Dictionary<Assembly, string> 
{ 
    { typeof(Whatever).Assembly, "another-queue" } 
}; 
var bus = CreateBus("my-queue", additionalEndpointMappings); 

2:すべての一般的な構成を新しい拡張方法に引き出します。私はほとんどそれを維持することが容易であることがわかったので、私はほとんどいつもこの方法を自分で使います。

まず、あなたはどこかに共有ライブラリに新しいRebusConfigurer拡張メソッドを作成します。

// shared lib 

public static class CustomRebusConfigEx 
{ 
    public static RebusConfigurer AsServer(this RebusConfigurer configurer, string inputQueueName) 
    { 
     return configurer 
      .Logging(...) 
      .Transport(...)) 
      .Sagas(...) 
      .Serialization(...) 
      .Options(...); 
    }  
} 

をしてから、あなたのエンドポイントに

Configure.With(...) 
    .AsServer("my-queue") 
    .Start(); 

を行くことによって、これを呼び出すことができます。

3:(1)の組み合わせに、(2)これを可能にします:まだ大きな柔軟性を維持し、実際にはかなりきちんと見て、反復コードを避けて終わることができ

Configure.With(...) 
    .AsServer("my-queue") 
    .StandardRouting(r => r.MapAssemblyOf<MessageType>("somewhere-else")) 
    .Start(); 

:)

+0

多くのおかげで、私は両方の方法を試してみるとあなたに戻る –

+0

あなたは1)の例を提供してください、私はアセンブリを使用することはできません'MapAssemblyOf ()'には** generic **タイプが必要です –