Question

J'ai utilisé des blocs dans chaque méthode de mon référentiel. Si je veux croiser des méthodes de référence, il semble que ce serait contre les meilleures pratiques d'initialiser un autre Datacontext. Qu'est-ce que je fais de travers? Si je déclare un contexte de données dans la classe au lieu d'utiliser des blocs dans les méthodes, je ne perdrai pas le pouvoir de disposer ??

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

   } 
}
Était-ce utile?

La solution

Si vous n'utilisez pas d'instruction using, vous pouvez toujours en disposer explicitement. Même si vous ne supprimez pas le contexte de données, les références croisées entre ces méthodes créeront un nouveau contexte de données. Cela peut ou peut ne pas être une bonne chose, selon votre utilisation. Réfléchissez à l'aspect de gestion des états du contexte de données et déterminez si vous souhaitez isoler les méthodes les unes des autres ou non. Si vous souhaitez éviter de créer un nouveau contexte tout le temps, surchargez les méthodes avec des versions qui prennent le contexte en paramètre.

Notez que vous n'avez généralement pas besoin de besoin pour disposer d’un contexte de données , bien que j’ai tendance à me défaire de tout ce qui met en œuvre IDisposable.

Autres conseils

En fait, je pense que c'est sémantiquement (ou comment devrais-je dire cela), il n'est pas correct de créer et de disposer d'un contexte de données dans votre référentiel.

Je veux dire: si vous ouvrez une nouvelle connexion à la base de données dans chacune des méthodes de votre référentiel, vous le faites mal à mon humble avis. C'est trop fin. La classe de référentiel n'a aucune connaissance du "contexte" dans lequel elle est utilisée. Votre référentiel ne doit pas être responsable de l'ouverture / la fermeture des connexions ou du démarrage et de la validation des transactions. Le contexte est roi et le référentiel n'a aucune connaissance du contexte dans lequel il est utilisé. Ainsi, à mon humble avis, il incombe à la couche application ou à la couche service d'ouvrir de nouveaux objets DataContext et de les fermer / en disposer. (Il en va de même pour les transactions).

Donc, voici comment je le fais: (notez que je n'utilise pas Entity Framework, mais j'utilise NHibernate. Je suppose que la classe DataContext dans l'EF est similaire à la ISession dans NHibernate):

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

(Ce n'est pas du code réel, il ne sera même pas compilé car ISession n'a pas de méthode Commit.;) À la place, la StartTransaction retourne une ITransaction qui a une sorte de méthode commit, mais Je pense que tu vas attraper ma dérive. ;))

L'instruction using est un sucre syntaxique. Il compile en un bloc try / finally avec l'appel Dispose () de la section finally. Cela garantit que Dispose sera appelé même si une exception se produit.

Vous pouvez appeler .Dispose () sur une classe sans utiliser d'instruction 'using' - vous le ferez généralement dans la méthode Dispose de votre référentiel, si vous en avez une.

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