2016-04-05 15 views
0

私は、次の例を作成することができました:インターセプト法の要求と変更パラメータ値

ObservableClass

public class ObservableClass : MarshalByRefObject 
{ 
    public int DoSomething(int id, params string[] names) 
    { 
     return 1 + names.Length; 
    } 

    public int DoSomethingElse(int id, params string[] names) 
    { 
     return 1 + names.Length; 
    } 
} 

インターセプタ

public class Interceptor : RealProxy 
{ 
    private readonly object _target; 

    public Interceptor(object target) : base(target.GetType()) { _target = target; } 

    public override IMessage Invoke(IMessage msg) 
    { 
     var methodCall = msg as IMethodCallMessage; 
     return methodCall != null ? HandleMethodCall(methodCall) : null; 
    } 

    private IMessage HandleMethodCall(IMethodCallMessage methodCall) 
    { 
     try 
     { 
      var newArgs = methodCall.InArgs; 
      if (methodCall.MethodName == "DoSomething") 
      { 
       for (var i = 0; i < newArgs.Length; i++) 
       { 
        if (methodCall.GetArgName(i) == "names") 
        { 
         newArgs[i] = new string[] { "a1", "a2", "a3", "a4" }; 
        } 
       } 
      } 
      var result = methodCall.MethodBase.Invoke(_target, newArgs); 
      return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall); 
     } 
     catch (TargetInvocationException invocationException) 
     { 
      var exception = invocationException.InnerException; 
      return new ReturnMessage(exception, methodCall); 
     } 
    } 

    public static T Wrap<T>(T target) where T : MarshalByRefObject 
    { 
     return (T)new Interceptor(target).GetTransparentProxy(); 
    } 
} 

そしてによってそれを呼び出す:

var temp = Interceptor.Wrap(new ObservableClass()); 
var doSomethingRes = temp.DoSomething(1, "a", "b", "c"); 
var doSomethingElseRes = temp.DoSomethingElse(1, "a", "b", "c"); 

出力:doSomethingRes = 5、doSomethingElseRes = 4

これは私がのMarshalByRefObjectとリモートRealProxyのの使用は私のために非常に高価になるだろうと信じているが、いくつかの研究の後、働いています実際のアプリケーションのシナリオ

他のオプション(軽量で優れたパフォーマンス)を使って、何か似たようなことをしなければならないのだろうか?

+1

デコレータを手作業で作るのは何ですか? –

+0

@DiligentKeyPresser私の考えは、私の "target"メソッドで抽象クラスを拡張するクラスごとにデコレータの代わりに単純な "論理"を作ることです。そして、将来、 "余分な"アドオン "プラグイン"は別の "特別な"デコレータクラスを持つ必要はありません..... – Dryadwoods

答えて

0

はい.netリモート処理は非常に遅いです。高いパフォーマンスが必要な場合は、動的プロキシを使用できます。

城ウィンザーはdynamic proxiesinterceptionをサポートしています。

関連する問題