2009-07-06 6 views
3

Je voudrais être capable de créer un proxy d'exécution pour un POCO, dans le même style que je pourrais en Java en utilisant les bibliothèques de proxying JRE ou cglib.Comment exécuter les POCO de proxy d'exécution?

J'ai vu Castle DynamicProxy qui ressemble à ça, mais la documentation n'est pas géniale. Je suis également surpris que ce genre de chose ne soit pas dans le .Net Framework lui-même.

Est-ce que quelqu'un:

  • connaissez des bonnes ressources pour le château DynamicProxy?
  • Vous connaissez des approches alternatives?

Merci!

Répondre

2

Cela ne vaut peut-être pas grand-chose, mais l'une des raisons pour lesquelles vous ne voyez pas proliférer de proxies dynamiques dans .NET est que les langages .NET les plus communs (C#, VB.NET) diffèrent de Java dans un aspect très important:

En Java, toutes les méthodes sont virtuelles à moins qu'elles ne soient explicitement déclarées scellées.

En C# (et VB.NET IIRC), toutes les méthodes et propriétés sont scellées sauf si elles sont explicitement déclarées virtuelles.

Cela signifie que la valeur potentielle d'un proxy dynamique est beaucoup plus faible dans .NET que dans Java. Vous devez explicitement concevoir vos objets .NET pour être 'proxyable', et la plupart des gens ne font pas cela - il faut prendre une décision consciente pour rendre un objet .NET 'proxyable'.

Il est vraiment si rare de voir un proxy dynamique .NET en dehors des conteneurs DI que je ne peux pas penser à d'autres proxies dynamiques que Castle. Notez que le comportement "scellé par défaut" est une caractéristique des langages .NET - il est très concevable que l'on puisse concevoir un langage basé sur .NET qui a le même comportement "virtuel par défaut" que Java . Bien que je n'en connaisse aucun, je serais surpris si une telle langue n'existe pas. Après tout, tout est dans le compilateur.

1

"Je suis également surpris que ce genre de chose ne soit pas dans le .Net Framework lui-même."

Il y a. Bien que pas complet, élégant ou performant. Vous pouvez utiliser créer un proxy générique qui hérite de RealProxy et accepte peut-être l'objet à utiliser. Pour obtenir le proxy, vous obtenez un proxy transparent de votre realproxy et vous le lancez dans votre type de wrapee (est-ce un mot?). Maintenant, vous avez un proxy. Toutes les méthodes sur le proxy peuvent être traitées dans une invocation surchargée (IMessage msg) dans votre RealProxy. Passez-les tels quels à votre objet réel (wrapee) ou faites n'importe quoi d'autre entre eux.

Cavets: Votre objet à transmettre par proxy doit hériter de MarshalByRef. C'est assez lent. Je ne l'utiliserais pas pour des fonctionnalités souvent utilisées. C'est toute l'infrastructure à distance en jeu ici. ILgen est le meilleur moyen dans la plupart des cas, mais il y a certains cas où j'ai dû utiliser ci-dessus ladite méthode.

Questions connexes