2016-09-27 4 views
2

私はRabbitMQを使ってアプリケーション(RPC)間の通信を行っていますが、私は必要な方法を呼び出すための適切な方法について何かジレンマがあります。私は利用可能なメソッドの束を含むクラスがあり、私はラビットメッセージで運ばれた文字列に一致するものを実行する必要があります。Method.Invoke()vsスイッチ

オプション1: HEREの方法を使用すると、はるかにクリーンで見やすくなりますが、それに対して何かがあるかどうかは疑問です。例えばパフォーマンスの低下、悪い習慣など

var method = this.GetType().GetMethod(methodNameString); 
method.Invoke(this, messagebody); 

オプション2: あなたが同じ場所にあるすべての可能なアクションを保つためにDictionary<string, Action>を使用して試すことができますスイッチ

switch(methodNameString) 
case: method1 
    method1(); 
case: method2 
    method2(); 
... 
+1

非常に高速でなければなりませんか? methodNameStringは(オブジェクトの任意のメソッドを呼び出すことができるため)外部システムから提供されていますか? – Chet

+1

私の心配は、メッセージキューから名前が来る任意のランダムメソッドを陽気に呼び出すことです。だから彼らが属しているクラスには何も持っていないことを確かめてください。しかし、それは簡単で明白です。私はスイッチよりもはるかに良く、 'Dictionary よりも優れています。しかし、私は洞窟に住んでいて、私は火を恐れています。 –

+0

@Chet外部エンティティからWebServiceを呼び出し、データのチェック(xsdなど)を渡してから、WebServiceがメッセージブローカー経由でWindowsサービスにコマンドを送信します。 –

答えて

2

反射事は大丈夫です。反射は、(共通の)メッセージキューよりもはるかに高速です。パフォーマンスのボトルネックとなる可能性は非常に低いです。

メッセージプロデューサが任意のメソッドを呼び出すことを許可していることに注意してください。これは、セキュリティ上の懸念や、プロデューサが社内のものを呼び出すようになるとレイヤリング違反になる可能性があります。

また、システムの静的解析が難しくなります。たとえば、「用途の検索」を実行すると、どのメソッドが呼び出されているのかを知ることはできません。

私は完全性のためにこれを言及しています。私はそれが正しいアプローチだと考えています。

2

を使用しました。すべてmethod1 ... methodNが同じ形式である必要があります:

// method1..methodN can be called 
Dictionary<String, Action> myMethods = new Dictionary<String, Action>() { 
    {"method1",() => method1()}, 
    {"method1Synonym",() => method1()}, 
    ... 
    {"methodN",() => methodN()}, 
}; 

... 

myMethods[methodNameString]();