2010-03-01 4 views
4

Dans une application ASP.NET Rob Conery style MVC, vous avez généralement un dépôt:Comment disposer correctement un Linq to SQL DataContext dans un référentiel?

public class CustomerRepository 
{ 
    DataContext dc = new DataContext(); 

    public IQueryable<Customer> AllCustomers() 
    { 
     return db.Customers; 
    } 

    public Customer GetCustomer(int customerID) 
    { 
     return db.Customers.FirstOrDefault(c => c.CustomerID = customerID); 
    } 
} 

et un contrôleur:

public class CustomerController: Controller 
{ 
    CustomerRepository _repository; 

    public ActionResult Index() 
    { 
     var data = _repository.AllCustomers(); 
     return view("Index", data); 
    } 

    public ActionResult Details(int id) 
    { 
     var data = _repository.GetCustomer(id); 
     if (data !=null) 
      return view("Details", data); 
     else 
      return view("NotFound"); 
    } 
} 

Le contrôleur est instancié throught une usine de contrôleur dans l'ASP. Moteur de base NET MVC, lorsqu'une requête lui est acheminée via le moteur de routage. Il exécute ensuite la méthode appropriée sur le contrôleur.

En supposant que je veux implémenter IDisposable dans le DataContext, comment peut-on correctement Dispose le DataContext, sans avoir à ré-instancier le DataContext pour chaque méthode dans le référentiel?

+0

http://stackoverflow.com/questions/821574 –

+2

@Mehrdad: Cette question est tout le débat « éliminer vs pas disposer ». Ce n'est pas la question posée ici. –

+0

nous avons besoin d'une nouvelle étiquette [Rob-Conery-Style] ;-) – mxmissile

Répondre

4

rendre le référentiel jetable et disposer du datacontext dans sa méthode Dispose. Si vous vous demandez qui dispose du dépôt, Rob utiliserait probablement un conteneur IOC qui injecterait le repo dans le contrôleur avec une instance par requête et disposerait automatiquement le repo à la fin de la demande.

+0

Est-ce que cela fonctionne parce que le conteneur IOC est conscient des objets jetables (c'est-à-dire les objets implémentant IDispose)? –

+0

Oui. Autofac est mon conteneur préféré pour ce genre de choses. l'approche basse est d'instancier et de disposer le conteneur dans chaque action en utilisant un bloc utilisant – mcintyre321

1

réellement DataContext est IDisposable. Vous devez envelopper chaque action dans le contrôleur en using(CustomerRepository _repository = new CustomerRepository()) { ... } et mettre en œuvre IDisposable dans le dépôt simplement en appelant ds.Dispose()

+0

Y at-il un moyen de le faire quand le contrôleur sort du cadre, de sorte que je n'ai pas à le répéter pour * chaque * méthode de contrôleur ? –

+0

Andrey: si vous encapsulez chaque action dans un bloc 'using', votre référentiel n'a pas besoin d'implémenter IDisposable. Ou implémentez IDisposable et ne vous inquiétez pas d'envelopper le contexte de données en utilisant le bloc – ram

+0

Robert: ne jamais le faire, ne comptez jamais sur sortir de la portée. J'ai eu un sérieux problème de production à cause de cela. le manuel est toujours mieux. – Andrey

Questions connexes