Was ist der beste Weg, um einen dynamischen Proxy in C#zu implementieren?
-
15-10-2019 - |
Frage
Ich muss in C#einen dynamischen Proxy erstellen. Ich möchte, dass diese Klasse eine andere Klasse einpackt und ihre öffentliche Benutzeroberfläche übernimmt und die Aufforderungen für diese Funktionen weiterleitet:
class MyRootClass
{
public virtual void Foo()
{
Console.Out.WriteLine("Foo!");
}
}
interface ISecondaryInterface
{
void Bar();
}
class Wrapper<T> : ISecondaryInterface where T: MyRootClass
{
public Wrapper(T otherObj)
{
}
public void Bar()
{
Console.Out.WriteLine("Bar!");
}
}
So möchte ich es verwenden:
Wrapper<MyRootClass> wrappedObj = new Wrapper<MyRootClass>(new MyRootClass());
wrappedObj.Bar();
wrappedObj.Foo();
produzieren:
Bar!
Foo!
Irgendwelche Ideen?
Was ist der einfachste Weg, dies zu tun?
Was ist der beste Weg, dies zu tun?
Vielen Dank.
AKTUALISIEREN
Ich habe versucht, die Empfehlung von Wernight zu befolgen und dies mit C# 4.0 -Dynamikproxies implementieren zu können. Leider stecke ich immer noch fest. Der Punkt des Proxy ist es, die andere Schnittstelle nachzuahmen, die (normalerweise normalerweise) erwartet wird. Durch die Verwendung von DynamicObject muss ich alle Clients davon ändern, um "dynamisch" anstelle von "iscondaryInterface" zu verwenden.
Gibt es eine Möglichkeit, ein Proxy -Objekt zu erhalten, so dass, wenn es ein A einnimmt, (statisch?) Werte, dass es eine Schnittstelle von A unterstützt? Und wenn es ein B wickelt, wirbt es, das die Schnittstelle von B unterstützt?
Update 2
Zum Beispiel:
class MySecretProxy : DynamicObject, ISecondaryInterface
{
public override void TryInvokeMember(...) { .. }
// no declaration of Bar -- let it be handled by TryInvokeMember
}
Lösung
.Net 4 DynamicObject
Kann Ihnen helfen, das zu erreichen.
Früheres .NET -Framework kann verwenden:
- Aspekt#
- Encase AOP
- Spring.net
- Aspekt.net
- Aspektdng
- Dynamischer Proxy
- Komponieren*
- Loom.net
- Postsharp
Jedes dieser Frameworks verwendet eine Zahlen -Techniken zur Injektion von Code vor und nach der Ausführung einer Methode. Diese fallen im Allgemeinen in 4 Kategorien.
- MSIL -Injektion - Hier injizieren wir MSIL -Code in den Körper der ausführten Methode. (Post scharf)
- Laufzeit dynamische Injektion - Mithilfe von Techniken wie Reflexion rufen wir Methoden dynamisch auf.
- Type Builder Injection - In Bezug auf die Laufzeit -Injektion erstellen wir einen Typ basierend auf dem Typ, den wir in den Vordergrund stellt und dann durch diesen Typ marschallen Anforderungen erstellt werden. (Dynamischer Proxy)
- Containerinjektion - Anfragen werden durch einen Container geleitet, der vor und nach der Ausführung unserer Methode Code aufruft.
Siehe das kompletter Artikel.
ich weiß das Castle -Projekt's Dynamischer Proxy wird oft verwendet (wie in MOQ Nur um ein großes Projekt zu nennen).
Antwort auf aktualisiertes Thema
Was Sie geschrieben haben, wird nicht kompilieren. Dynamisch Proxies sind runtime generierte Code, sodass Sie eine konkrete Instanz der Klasse erstellen müssen, die Sie auf die eine oder andere Weise proxieren. Vielleicht suchen Sie zu tun AOP (Aspekt-orientierte Programmierung).
class MySecretProxy<T> : DynamicObject, T where T : new()
{
private T _instance = new T();
public override void TryInvokeMember(...) { ... }
}
MySecretProxy<Bar> bar;
Andere Tipps
Haben Sie sich das Dynamicproxy des Castle Project angesehen? Es kann liefern, was Sie letztendlich erreichen möchten. Sehen http://www.castleproject.org/dynamicproxy/index.html
Es ist auch Open Source, sodass Sie es bei Bedarf sogar aufgeben können.
Sie können dies mit RealProxy tun, wenn der Zieltyp eine Schnittstelle ist oder von MarshalbyrefObject abgeleitet ist.
Vielleicht möchten Sie sich ansehen linfu das enthält einen dynamischen Proxy -Mechanismus.
Ich kenne die Stellvertreter, die von NhiberNate für faule Laden verwendet wurden
Schloss
Linfu
Spring Bytecode