Question

Qu'est-ce qu'un objet proxy dans l'inversion du sens contrôle / aspect?

De bons articles sur ce qu'est un objet proxy?
Pourquoi voudriez-vous en utiliser un?
Et comment en écrire un en C #?

Était-ce utile?

La solution

En général, un objet proxy est un objet (une instance d'une classe) qui expose exactement la même interface publique qu'une "vraie classe". mais simplement transfère tous les appels faits à ses membres à l'autre classe réelle. Les objets proxy sont utilisés pour diverses raisons ...

Un des objectifs est de "faire semblant". être la vraie classe pour qu'un composant client (ou un objet) puisse "croire" il parle au "réel" objet, mais à l'intérieur du proxy, d'autres tâches (comme la journalisation, le support transactionnel, etc.) sont effectuées en même temps ... Deuxièmement, un proxy peut être très économique en comparaison de l'objet réel ,. et est souvent utilisé pour que les objets réels puissent être conservés (désactivés ou libérés dans un pool afin d’être utilisés par d’autres clients) lorsque le client ne les utilise pas ... Le proxy reste "en vie". et le client pense qu'il a toujours une connexion avec l'objet réel, mais à chaque fois qu'il "appelle". l'objet, il appelle en fait le proxy, qui récupère un autre objet réel juste pour gérer l'appel, puis libère l'objet réel une fois l'appel terminé.

En ce qui concerne Inversion de contrôle (IOC) .., il s'agit d'un modèle courant (également appelé injection de dépendance), dans lequel les objets dépendants à l'intérieur d'une classe sont "injectés". dans une instance de la classe, à partir du code client, pour contrôler la version d'un objet dépendant que l'instance utilisera ... IOC peut être utilisé pour injecter un "proxy" objet dans une classe où il pense utiliser l'objet réel ... L'expression Inversion of Control fait référence au fait que, lorsque vous utilisez ce modèle, la décision relative à l'implémentation réelle n'est plus sous le contrôle de la classe effectuant l'appel, mais au client de cette classe, lorsqu'elle injecte une instance d'un objet dépendant dans la classe à utiliser pour cet appel.

Généralement, le terme IOC est utilisé avec ce qu'on appelle un conteneur IOC , qui est une classe spécialement conçue pour être responsable de la création d'instances de classes dépendantes sur la base d'informations à couplage lâche sur ces classes (Types) qu'il provient d'une source autre que les dépendances câblées (le plus souvent, d'une sorte de fichier de configuration). Généralement, lorsque vous utilisez un conteneur IOC, vous en créez une instance au démarrage de l'application, puis (en lisant les données de configuration ou autre), vous "enregistrez". chacune des classes (types) dont le conteneur IOC sera responsable, avec une valeur de clé. La clé est souvent le type abstrait ou l'interface que toutes les instances de cet enregistrement doivent implémenter). Ensuite, dans les opérations normales de votre application, où vous pourriez sinon créer une instance de l'un de ces types, appelez le conteneur IOC et demandez-lui une instance à la place, en utilisant le type abstrait / Interface comme clé. . Le conteneur IOC utilise ensuite une réflexion ou un chargement dynamique (ou autre) pour créer une instance de n'importe quel type "enregistré". avec cette clé. Ainsi, en modifiant simplement les données de configuration, vous pouvez contrôler les types réels utilisés par l’application, en les modifiant dans un environnement ou un emplacement de déploiement par rapport à ceux utilisés dans un autre.

Autres conseils

L’ancien "Gang of Four" est une très bonne ressource à ce sujet. livre de patrons de conception. Ce livre est très utile pour quiconque développe des logiciels orientés objet. J'utilise personnellement des objets proxy pour le chargement paresseux avec NHibernate. Je n'utilise pas de proxy avec inversion de contrôle car je résous les types interfacés uniquement avec mon IoC.

L'explication de Charles Bretana est très bonne.

Je ne peux pas imaginer la relation entre proxy et AoP. Quelqu'un pourrait-il expliquer cela ici?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top