2010-03-11 7 views
0

J'ai une interface (IDbAccess) pour une classe d'accès à la base de données afin que je puisse la tester unitaire en utilisant Unity. Tout fonctionne bien dans Unity et maintenant je veux que la classe de base de données concrète implémente IDisposable afin qu'elle ferme les connexions db. Mon problème est que Unity ne comprend pas que ma classe concrète est jetable parce que l'interface (IDbAccess) ne peut pas implémenter une autre interface.Utilisation de Unity et des interfaces, comment créer une classe concrète qui implémente IDisposable

Alors, comment puis-je écrire du code comme celui-ci (pseudo-code) afin que Unity soit conscient qu'il doit disposer de la classe dès que j'ai terminé?

Using var MyDbAccessInstance = Unity.Resolve<IDbAccess> 
{ 
} 

Merci

Ryan

+0

Utilisez Castle Windsor au lieu de Unity. Cela traitera correctement de cette situation. –

+0

Malheureusement pas une option que l'application est en production et ce serait trop de changement. –

Répondre

1

Vous pourriez en théorie créer une nouvelle IMyDbAccess d'interface qui hérite à la fois IDisposable et IDbAccess. Donc, quelque chose comme

public interface IMyDbAccess : IDbAccess, IDisposable 
{ 
} 

public class MyClass : IMyDbAccess 
{ 
    // Stuff from IDbAccess 

    public void Dispose() 
    { 
    } 
} 

Laisseriez-vous:

IUnityContainer unityContainer = new UnityContainer(); 

using (var bob = unityContainer.Resolve<IMyDbAccess>()) 
{ 
    // something 
} 

Ne pas oublier de changer votre gestionnaire de vie à ExternallyControlledLifetimeManager lorsque vous vous inscrivez le type de sorte que le conteneur a une référence faible à la classe.