On me dit que j'ai besoin de Je dois vérifier avec les experts: est Il est acceptable d'implémenter Notez que la classe de référentiel n'a pas de variables de membre de classe. P> Idisposable code> à travers une classe de base? P>
/// Sample repository. Note that I return List<T> as IEnumerable,
/// and I use IDisposable
///
public class CompanyRepository : DisposableBase, ICompanyRepository
{
public IEnumerable<CompanyDetail> GetOneCompany(int? CompanyID)
{
var t = from c in _entities.CompanyDetail
where c.CompanyID == CompanyID.Value
select c;
return t.ToList();
}
}
/// <summary>
/// Disposable implementation based on advice from this link:
/// from Http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
/// </summary>
public class DisposableBase : IDisposable
{
protected TLSAdminEntities1 _entities;
public DisposableBase()
{
_entities = new TLSAdminEntities1();
disposed = false;
}
private bool disposed ;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_entities.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
4 Réponses :
Généralités prononcées, vous devez mettre en œuvre Idispotable dans chaque classe, où vous avez des membres privés qui sont eux-mêmes impliqués Idisposables. Ces ressources doivent être "libérées". Je vous conseille vivement de lire ce très bon papier sur codeProject sur le motif iDisposable. p>
La réponse est "Cela dépend". P>
Si la méthode "Disposer ()" dans une superclasse est suffisante, vous n'avez certainement pas besoin de le répercuter dans chaque sous-classe. P>
La "Superclass" pourrait être la classe de base; Ce pourrait être une ou plusieurs sous-classes. P>
Cela dépend de ce que vous allouez et de ce qui doit être nettoyé. P>
IMHO ... P>
Voici ce que MSDN a à dire: P>
http://msdn.microsoft.com/en-us/magazine/ cc163392.aspx p>
Lorsque vous découlez d'un type jetable, et que ce type dérivé ne fait pas Introduisez de nouvelles ressources, alors rien ne doit être spécial à faire. La mise en œuvre isisposable de type de base s'occupera de nettoyer ses ressources et votre sous-classe peuvent être blessiblement ignorantes de la des détails. p> blockQuote>
<= En d'autres termes, vous n'avez pas nécessairement besoin de réétablir éliminer et plus p>
... mais ... p>
Cependant, il est également courant d'avoir une sous-classe contenant de nouveaux ressources qui doivent être nettoyées. Dans ce cas, vos besoins de classe Pour libérer ses ressources, tout en veillant à ce que le type de base Les ressources sont également libérées. Faites cela en remplaçant la méthode de nettoyage, libérer vos ressources, puis appelez le type de base à nettoyer ses ressources, comme à la figure 6. p> blockQuote>
Cela dépend de la question de savoir si vous avez des ressources dans la classe dérivée qui doit être disposée. S'il existe des ressources spécifiques à la classe dérivée, la mise en œuvre de Idisposable code> uniquement sur la classe de base ne sera pas suffisante. P>
Dans mon cas, je n'ai rien de local dans ma classe de référentiel héritée. Si tel est le cas, alors ma mise en œuvre de SociétéRepository est terminée?
S'il n'y a rien dans la classe dérivée qui nécessite une élimination explicite, la mise en œuvre de la classe de base est probablement suffisante.
Seule la classe de base devrait réellement implémenter i> Idisposable code>. Les classes dérivées doivent généralement ajouter leur code de nettoyage en prenant sur
Dispose (BOOL) code>, plutôt que d'ajouter une nouvelle implémentation de
Idisposable.Dispose () code>.
@supercat: C'est ce que je suggérais, mais je pense qu'il serait utile de préciser que cela devrait être remplacé par la classe dérivée.
@Jamesjohnson: Le terme implémente code>, tel que appliqué aux interfaces, a une signification technique particulière. Il sera très souvent nécessaire que les classes dérivées incluent le code pour gérer le nettoyage code> Idisposable CODE>, mais qui devraient être effectués en plaçant à une implémentation de classe de base de
Idisposable code>, plutôt que par Définir un nouveau.
C'est bien de disposer d'une classe de base. La chose importante ici consiste à nettoyer les ressources non gérées, ce qui signifie dans ce cas la fermeture des connexions de base de données. Je dirais que vous seriez mieux à connecter à ASP.Net avec des éléments tels que httpModules ou des filtres d'action pour gérer votre unité de travail et faire le disposition pour un type de configuration de l'unité de travail, mais si Vous êtes à la base de vous assurer d'appeler à éliminer les instances de votre référentiel, avec une classe de base qui dispose d'un cadre de cadre d'entité est correcte (et vous pouvez toujours utiliser la classe de base pour ces référentiels, même avec les dispositions avec un filtre / module). p>