2009-07-16 5 views
5

In Java ist es möglich, eine Schnittstelle mit einem dynamischen Proxy, um so etwas zu dynamisch implementieren:Was ist das .Net-Äquivalent von Java's Dynamic Proxies?

public static <T> T createProxy(InvocationHandler invocationHandler, Class<T> anInterface) { 
    if (!anInterface.isInterface()) { 
     throw new IllegalArgumentException("Supplied interface must be an interface!"); 
    } 
    return (T) Proxy.newProxyInstance(anInterface.getClassLoader(), new Class[]{anInterface}, invocationHandler); 
} 

Gibt es ein Äquivalent in .net?

Antwort

4

Es gibt mehrere Bibliotheken, die diese in .NET implementieren. Here's a list of them, mit einem Benchmark.

+0

Ja. Es gibt ein Framework, das diese Funktionalität bietet. –

0

Es gibt keine direkte Äquivalent siehe aber How to do Dynamic Proxies in C# für einige Lösungen:

Hintergrund: Eine dynamische Proxy dynamisch eine Klasse an Laufzeit, die einer bestimmten Schnittstelle entspricht erzeugt, Proxying alle Aufrufe zu eine einzige "generische" Methode.

Früher fragte Stellsmi, ob es möglich ist, dies in .NET zu tun (es ist ein Standard-Teil von Java). Da es das zweite Mal, das ich über sie in wie vielen Tagen gesprochen habe, rechne ich es wert ist bloggen ...

2

Ja. Sie stammen aus dem Abstract RealProxy class.

+0

Sie liegen falsch. RealProxies werden für ganz andere Zwecke verwendet (.NET Remoting). Darüber hinaus können Sie sie nicht für Nicht-MBR-Typen verwenden. –

+3

RealProxies werden für das Remoting verwendet, sie müssen jedoch nicht nur für diesen Zweck verwendet werden. Sie können sie perfekt verwenden, um Anrufe in demselben Prozess abzufangen. Während sie auf MarshalByRefObject für _classes_ beschränkt sind, ging es bei der Frage um _interfaces_, und RealProxy unterstützt alle Schnittstellen (da sie immer vtable-dispatched sind). –

1

Werfen Sie auch einen Blick auf PoshSharp (AOP-Framework für .NET) - es kann ähnliche Dinge tun, aber in der Kompilierzeit. Wahrscheinlich bevorzugen Sie den Ansatz, den es unterstützt.

4

Die am weitesten verbreitete ist die Castle Project's Dynamic Proxy, die auch von mehreren (oder mindestens 1) Mocking Frameworks verwendet wird. Denken Sie daran, dass Methoden (und Sugared-Up-Methoden wie Eigenschaften) in dotnet standardmäßig nicht virtuell sind, was einige Kopfschmerzen bereiten kann, wenn Sie es nicht in Ihrem Klassendesign erwarten.

+0

Mehr als ein Mock Framework. Siehe http://castleproject.org/dynamicproxy/index.html für eine sehr unvollständige Liste von Projekten, die Dynamic Proxy verwenden –

Verwandte Themen