2009-07-16 33 views
5

w Javie możliwe jest dynamicznie implementować interfejs przy użyciu dynamicznego proxy, coś takiego:Co to jest odpowiednik .NET dynamicznych serwerów proxy Java?

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); 
} 

Czy istnieje odpowiednik w .NET?

Odpowiedz

4

Istnieje kilka bibliotek, które wdrażają to w .NET. Here's a list of them, z punktem odniesienia.

+0

Tak. Istnieje zestaw frameworków zapewniających tę funkcjonalność. –

0

Nie ma bezpośredni odpowiednik ale patrz How to do Dynamic Proxies in C# dla niektórych obejściach:

Tło: Dynamiczny proxy dynamicznie generuje klasę na wykonywania zgodnym ze szczególnym interfejsu buforowania wszystkie wywołania do pojedyncza metoda "generyczna".

Wcześniej Stellsmi zapytał, czy jest to możliwe w w .NET (jest to standardowa część Javy w standardzie ). Widząc, jak to drugi raz rozmawiałem o tym w tyle dni, Sądzę, że warto blogowania ...

2

Tak. Pochodzi od abstrakcji RealProxy class.

+0

Mylisz się. RealProxy są używane do zupełnie innych celów (.NET Remoting). Ponadto nie można ich używać dla typów innych niż MBR. –

+3

RealProxy są używane do zdalnego zarządzania, ale nie muszą być używane tylko w tym celu. Możesz doskonale wykorzystać je do przechwytywania połączeń w tym samym procesie. Co więcej, podczas gdy są one ograniczone do MarshalByRefObject dla _classes_, pytanie dotyczyło _interfaces_, a RealProxy obsługuje wszystkie interfejsy (ponieważ są zawsze wywoływane vtable). –

1

Zobacz także PoshSharp (framework AOP dla platformy .NET) - może wykonywać podobne czynności, ale w czasie kompilacji. Prawdopodobnie wolisz podejście, które obsługuje.

4

Najpopularniejszym z nich jest Castle Project's Dynamic Proxy, który jest również używany przez kilka (lub przynajmniej 1) szyderczych ramek. Należy pamiętać, że metody (i uproszczone metody, takie jak właściwości) nie są domyślnie wirtualne w dotnet, więc mogą powodować pewne bóle głowy, jeśli nie przewiduje się ich w projekcie klasy.

+0

Więcej niż jedna szydercza ramka. Zobacz tutaj http://castleproject.org/dynamicproxy/index.html dla bardzo częściowej listy projektów korzystających z Dynamic Proxy –

Powiązane problemy