/ / Jak uruchomić proxy POCO? - .net, proxy, poco

Jak uruchamiać proxy POCO? - .net, proxy, poco

Chciałbym móc utworzyć proxy czasu wykonywania dla POCO, w tym samym stylu, co w Javie, używając JRE lub cglib proxying library.

Widziałem Zamek DynamicProxy Wygląda na to, że pasuje do rachunku, ale dokumentacja nie jest wspaniała, ale jestem zaskoczony, że tego typu rzeczy nie ma w samym .Net Framework.

Czy ktokolwiek:

  • Znasz jakieś dobre zasoby dla Castle DynamicProxy?
  • Znasz jakieś alternatywne podejścia?

Dzięki!

Odpowiedzi:

2 dla odpowiedzi № 1

To może nie być warte wiele odpowiedzi, ale jednopowodów, dla których nie widać rozprzestrzeniania dynamicznych serwerów proxy w .NET, jest to, że najczęściej spotykane języki .NET (C #, VB.NET) różnią się od Javy jednym bardzo ważnym aspektem:

W języku Java wszystkie metody są wirtualne, o ile nie zostaną jawnie zadeklarowane.

W języku C # (i VB.NET IIRC) wszystkie metody i właściwości są zapieczętowane, chyba że są jawnie deklarowane wirtualne.

Oznacza to potencjalną wartość dynamicznąproxy jest znacznie niższy w .NET niż w Javie. Musisz jawnie zaprojektować obiekty .NET, aby były "proxyable", a większość ludzi tego nie robi - podjęcie świadomej decyzji, aby obiekt .NET był "możliwy do autoryzacji".

W rzeczywistości tak rzadko spotyka się dynamiczny serwer proxy .NET poza DI Containerami, że nie mogę myśleć o innych dynamicznych serwerach proxy niż Castle.

Zauważ, że zachowanie "zapieczętowane domyślnie" jest cechą .NET Języki - bardzo możliwe jest, że można zaprojektować.Język oparty na sieci, który ma takie samo zachowanie "wirtualnie domyślnie" jak Java. Chociaż nie znam żadnego, zdziwiłbym się, gdyby taki język nie istniał, wszak wszystko jest w kompilatorze.


1 dla odpowiedzi nr 2

"Jestem także zaskoczony, że tego typu rzeczy nie ma w samym .Net Framework."

Jest. Chociaż nie kompletny, elegancki lub wydajny. Możesz użyć generycznego proxy, które dziedziczy po RealProxy i prawdopodobnie pobiera obiekt, który ma być proxy. Aby uzyskać proxy, uzyskasz transparentproxy z twojego realproxy i wyrzucisz go swoim typem wrapee (jest to słowo?) Teraz masz proxy Wszystkie metody na proxy mogą być obsługiwane w overridden Invoke (IMessage msg ) w swoim RealProxy. Przekaż je tak, jak jest to do twojego prawdziwego obiektu (wrapee) lub wykonaj cokolwiek innego pomiędzy nimi.

Cavets: Twój obiekt do prokury musi odziedziczyć po MarshalByRef. Jest dość powolny. Nie używałbym go do często wykorzystywanej funkcjonalności.To jest cała infrastruktura zdalna w grze tutaj.Leggen jest lepszy sposób w większości przypadków, ale są pewne przypadki, w których musiałem użyć powyższej metody.