2009-07-06 15 views
3

Ich würde gerne in der Lage sein, einen Laufzeit-Proxy für ein POCO zu erstellen, im gleichen Stil wie ich in Java unter Verwendung der JRE oder cglib Proxy-Bibliotheken.Wie Runtime Proxy POCOs?

Ich habe Castle DynamicProxy gesehen, die aussieht wie es die Rechnung passt, aber die Dokumentation ist nicht großartig. Ich bin auch überrascht, dass so etwas nicht im .Net Framework selbst ist.

Hat jemand:

  • wissen, dass gute Ressourcen für Castle Dynamic?
  • Wissen Sie alternative Ansätze?

Vielen Dank!

Antwort

2

Dies ist möglicherweise nicht viel wert, da die Antworten gehen, aber einer der Gründe, warum Sie keine Verbreitung von dynamischen Proxies in .NET sehen, ist, dass die meisten gängigen .NET-Sprachen (C#, VB.NET) von Java abweichen in einem sehr wichtigen Aspekt: ​​

In Java sind alle Methoden virtuell, es sei denn explizit deklariert versiegelt.

In C# (und VB.NET IIRC) sind alle Methoden und Eigenschaften versiegelt, sofern sie nicht explizit als virtuell deklariert werden.

Dies bedeutet, dass der potenzielle Wert eines dynamischen Proxy in .NET viel niedriger ist als in Java. Sie müssen Ihre .NET-Objekte explizit so gestalten, dass sie "proxyfähig" sind, und die meisten Leute tun das nicht - es ist eine bewusste Entscheidung, ein .NET-Objekt "proxyfähig" zu machen.

Es ist eigentlich so selten, einen dynamischen .NET-Proxy außerhalb von DI Containers zu sehen, von dem ich keine anderen dynamischen Proxies als Castle in Betracht ziehen kann.

Beachten Sie, dass die "Sealed standardmäßig das Verhalten ist eine Funktion von .NET Sprachen - es ist sehr denkbar, dass man eine .NET-basierte Sprache entwickeln könnte, die die gleiche" virtuelle standardmäßig das Verhalten als Java hat . Obwohl ich keine kenne, wäre ich überrascht, wenn eine solche Sprache nicht existiert. Schließlich ist alles im Compiler.

1

"Ich bin auch überrascht, dass diese Art von Sache nicht im .Net Framework selbst ist."

Es gibt. Obwohl nicht vollständig, elegant oder performant. Sie können einen generischen Proxy erstellen, der von RealProxy erbt und möglicherweise das Objekt als Proxy verwendet. Um den Proxy zu erhalten, erwirbst du ein transparentesProxy von deinem RealProxy und wirfst es dir deines Wrapees (ist das ein Wort?) Typ. Jetzt haben Sie einen Proxy. Alle Methoden auf dem Proxy können in einem überschriebenen Invoke (IMessage msg) in Ihrem RealProxy behandelt werden. Übergib sie, wie es ist, an dein wirkliches Objekt (wrapee) oder tu alles, was dazwischen ist.

Cavets: Ihr zu proxiedierendes Objekt muss von MarshalByRef erben. Es ist ziemlich langsam. Ich würde es nicht für häufig verwendete Funktionen verwenden. Dies ist die gesamte Remoting-Infrastruktur, die hier zum Einsatz kommt. ILgen ist der bessere Weg in den meisten Fällen, aber es gibt einige Fälle, wo ich oben genannte Methode verwenden musste.