2009-06-21 6 views
0

Q rapide pour vous experts en matière de modèles.Unité de travail et L2S DataContext

Je veux un modèle Repository qui est découplé de la technologie d'accès aux données réelle, comme je ne l'ai pas encore décidé et je veux qu'il soit flexible. Donc, cela pourrait être L2S, L2E, NHibernate, Lightspeed ou quoi que ce soit.

Mais je suis confus au sujet de cette chose UnitOfWork.

Dans le monde L2S, cela semble être votre DataContext. Mais qu'en est-il d'un monde non-L2S, imaginez que j'utilisais du SQL écrit à la main par exemple.

Ma question est qui fait quoi? Dans ma méthode Repo.Save(), devrait-il appeler le UnitOfWork.Commit qui génère alors le SQL INSERT/UPDATE requis?

Ne vous attendez pas à une réponse définitive, mais une discussion serait bonne, juste pour m'assurer que je suis sur la bonne voie!

Merci

Répondre

1

Référentiels peut certainement appeler COMMIT/enregistrer/soumettre sur l'unité d'objet de travail, ou ils pourraient laisser cela au consommateur. Je préfère ce dernier scénario, car il permet au consommateur de contrôler la durée de vie de l'instance d'unité de travail, ce qui permet au consommateur d'engager plusieurs référentiels:

// outside the repository layer 
// int productId defined elsewhere 
// int quantity defined elsewhere 

IUnitOfWork unitOfWork = ... instantiate/get a new instance of your DataContext ... 

ProductRepository productRepository = new ProductRepository(unitOfWork); 
Product product = productRepository.GetById(productId); 

Order order = new Order(); 
order.AddOrderLine(product, quantity); 

OrderRepository orderRepository = new OrderRepository(unitOfWork); 
orderRepository.Add(order); 

unitOfWork.Save(); // This calls SubmitChanges() on the DataContext 
+0

1) La technologie de persistance a fui dans le domaine en utilisant le DataContext (L2S). 2) Le DataContext peut être utilisé en dehors du contexte du référentiel, les clients peuvent simplement utiliser DataContext pour générer leurs propres requêtes, il n'y a donc pas besoin d'un référentiel. –

+1

Un conteneur IoC peut résoudre ces deux problèmes. IUnitOfWork a juste besoin d'une méthode SubmitChanges, ce qui signifie que les clients qui l'utilisent n'auront pas accès au contexte de données. Vous pouvez implémenter IUnitOfWork dans une classe partielle DataContext. Ensuite, pour les référentiels, ils devraient plutôt être résolus à partir du conteneur IoC via des interfaces. Les implémentations concrètes de ces dépôts peuvent avoir la classe concrète DataContext injectée via leurs constructeurs. – mvr

Questions connexes