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
 }
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top