Ce qui est vraiment intercepteurs faire avec ma classe de c#?
M'a demandé de mettre en œuvre château dynamique proxy dans mon asp.net application web et j'ai parcouru quelques articles que j'ai obtenu à partir de Château De Projet et Projet De Code sur le château dynamique proxy dans asp.net application web....
Les deux articles delt avec la création d'intercepteurs, mais je ne peux pas obtenir la moindre idée pourquoi intercepteurs sont utilisés avec des classes.... Pourquoi devrais-je interception de ma classe qui se comporte correctement?
pourquoi avez-vous été invité à utiliser les DP en premier lieu, puis?
OriginalL'auteur Chendur Pandian | 2010-04-07
Vous devez vous connecter pour publier un commentaire.
Disons que votre classe doit faire 3 choses pour une certaine opération:
Nous allons supposons que votre classe ne sais rien à propos de la spécifiques façon dont vous avez configuré votre sécurité, l'exploitation forestière et de la mise en cache. Vous avez besoin de dépendre sur des abstractions de ces choses.
Il existe quelques façons d'aller à ce sujet. Un moyen serait de créer un groupe d'interfaces et d'utilisation du constructeur d'injection:
Ce n'est pas horrible du code, mais de penser les problèmes que nous allons mettre en place:
La
OrderService
classe ne peut pas fonctionner sans tous les trois dépendances. Si nous voulons faire de sorte qu'il peut, nous devons commencer par émaillant le code avec la valeur null vérifie partout.Nous sommes en train d'écrire un tonne de code supplémentaire pour effectuer une intervention relativement simple (à la recherche d'un ordre).
Tous ce code réutilisable doit être répété dans chaque méthode, pour un très grand, laid, bug sujettes à la mise en œuvre.
Voici une classe qui est beaucoup plus facile à entretenir:
Dans La Programmation Orientée Aspects, ces attributs sont appelés Rejoindre Des Points, l'ensemble de ce qui est appelé un Point De Coupe.
Au lieu de l'écrire code de dépendance, plus et plus encore une fois, nous quittons le "les conseils" que certains autres opérations sont censés être effectuée pour cette méthode.
Bien sûr, ces attributs doivent se transformer en code parfois, mais vous pouvez reporter tout le chemin jusqu'à votre code de l'application principale, par la création d'un proxy pour la
OrderService
(à noter que laGetOrder
méthode a été faitvirtual
car elle a besoin d'être remplacée pour le service), et interception laGetOrder
méthode.L'écriture de l'intercepteur peut être aussi simple que cela:
Et la création du proxy:
Ce n'est pas seulement beaucoup moins de code répétitif, mais il supprime complètement la réelle dépendance, parce que regardez ce que nous avons fait - nous n'avons même pas ont une autorisation ou un système de mise en cache, mais le système fonctionne toujours. Nous pouvons vous suffit d'insérer l'autorisation et la mise en cache de la logique, plus tard, par l'enregistrement d'un autre intercepteur et de vérification pour
AuthorizeAttribute
ouCacheAttribute
.Espérons-le, c'est ce qui explique le "pourquoi".
Encadré: Que Krzysztof Koźmic commentaires, ce n'est pas une DP sur les "meilleures pratiques" à l'utilisation d'une dynamique de l'intercepteur de ce genre. Dans le code de production, vous ne voulez pas avoir l'intercepteur en cours d'exécution pour inutile de méthodes, afin de l'utiliser un IInterceptorSelector à la place.
IInterceptorSelector
mise en œuvre)Koźmic: C'est votre blog qui m'a DP je suis donc heureux de vous approuver! Et je suis plutôt d'accord sur le
IInterceptorSelector
préférence, j'exclus ici afin de faire de cet exemple de base plus abordable pour ceux qui ne connaissent DP.Question au hasard pour la mise en cache de l'attribut de l'utilisation de la lecture de ce qui est considéré comme la meilleure pratique pour la capture assez qui garantit l'unicité?
Quand vous dites "la mise en cache de l'attribut de l'utilisation de la lecture", voulez-vous dire exactement comment est le système de mise en cache/intercepteur mis en œuvre? C'est en fait une assez longue histoire qui est née ici: stackoverflow.com/questions/2330275/.... Le résultat final est un ensemble de la bibliothèque de quelques 20 classes. La façon dont je l'utilise, le
CacheAttribute
prend soit une chaîne de format (qui est appliquée pour les paramètres) ou un nom de méthode (pour les plus complexes de la génération de clés). C'est à la classe elle-même à définir suffisamment de clés uniques pour chaque méthode mis en cache.Oh, j'ai oublié de mentionner, la mise en cache de l'intercepteur utilise le complet nom du type qu'une partie de la clé, de sorte touches seulement besoin d'être unique dans l'étendue de chaque classe. C'est probablement une bonne "les meilleures pratiques", il est similaire à la façon dont ASP.NET poignées de script de l'enregistrement.
OriginalL'auteur Aaronaught
La raison pour laquelle vous avez utiliser Château-DynamicProxy est pour ce qu'on appelle la Programmation Orientée Aspect. Il vous permet d'introduire le code dans la norme de l'opération de débit de votre code sans avoir besoin de devenir dépendant sur le code lui-même.
Un exemple simple est, comme toujours, de l'exploitation forestière. Qui vous permettrait de créer un DynamicProxy autour d'une classe que vous avez des erreurs de qui il enregistre les données dans la méthode et les captures de toutes les exceptions et puis les journaux de l'exception.
À l'aide de l'intercepter votre code actuel n'a aucune idée qu'il existe (en supposant que vous avez votre logiciel intégré de façon découplée avec des interfaces bien) et vous pouvez modifier l'enregistrement de vos classes avec une inversion de contrôle conteneur à utiliser le proxy de classe à la place, sans avoir à changer une seule ligne d'autre où dans le code. Puis, quand vous résoudre le bug, vous pouvez désactiver l'utilisation de proxy.
Des utilisations plus avancées de l'utilisation de proxy peut être vu avec NHibernate où tout le lazy loading est gérée par le biais d'une procuration.
OriginalL'auteur Chris Marisic