2

Quand j'ai commencé avec Windsor, je pensais que DI serait simple. Maintenant, cela me cause de plus en plus de confusion.Cycle de vie approprié pour les classes de dépôt utilisant Castle Windsor

Un dépôt me frappe en tant que classe avec un cycle de vie singleton. Je devrais avoir une seule instance d'un FooRepository pour charger et enregistrer Foos dans la base de données pendant la durée de vie de l'application. Cependant, chaque référentiel contient une référence à un UnitOfWork, qui effectue la vérification sale, travaille avec la base de données, etc. Le UnitOfWork a un cycle de vie de PerWebRequest - cela n'a aucun sens que UnitOfWork soit un singleton, comme une instance singleton pourrait (par exemple) vider les modifications apportées par plusieurs sessions utilisateur en même temps. Alors j'ai un FooRepository singleton qui contient une référence à un UnitOfWork, qui à la fin de la session est disposé! Je ne suis même pas sûr de l'effet que cela aurait sur le comportement du dépôt, mais ça ne sonne pas bien. Peut-on expliquer, en anglais simple (d'accord peut-être avec du code), la manière appropriée de gérer le cycle de vie des classes Repository et UnitOfWork dans une application Web?

Répondre

5

Règle générale, le composant ne doit pas dépendre d'autres composants qui lui survivront. En d'autres termes, il est normal que transitoire dépende de singleton ou d'un composant de requête par Web, mais pas l'inverse.

La façon dont j'approche le scénario Repository - UoW est ma demande par requête Web, mais les référentiels sont sans état et transitoires.

+0

Transitoire? Ah, intéressant. Mais probablement utiliser un référentiel PerWebRequest avec un PerWebRequest UoW (comme je le fais actuellement) est également bien? (Cela semble fonctionner pour moi, de toute façon.) – David

+0

Que voulez-vous dire par apatride? Voulez-vous dire qu'ils ne contiennent pas de référence à un UoW? – David

+2

Oh, modification suggérée - 'le composant ne devrait pas dépendre des autres composants qu'il va survivre'. Mais je sais ce que tu voulais dire, merci! – David

2

Lorsque vous parlez de référentiel, je suppose que vous voulez dire un référentiel qui résume une session Nhibernate. Si oui, alors il ne devrait jamais être singleton. S'il s'agit d'un singleton, alors plusieurs threads de requête vont piétiner les uns les autres. J'ai personnellement vu quelques défauts autour de cela. Puisque le cycle de vie par défaut de Castle est singleton, si un développeur oublie de marquer explicitement le cycle de vie d'un composant, de mauvaises choses commencent à se produire.

Il devrait idéalement être par demande (suivant le concept d'unité de travail). Le seul pilote à cette approche est que vous avez activé le mode de compatibilité Asp.net dans votre application (si ce n'est pas Asp.net). L'autre façon consiste à marquer un transitoire de référentiel. Mais l'inconvénient de cette approche est que Castle va instancier un nouvel objet de référentiel chaque fois qu'un composant en a besoin.

Questions connexes