2010-11-12 10 views
1

Nous avons un site utilisant Unity et IUnitOfWork pour notre contexte EF. Jusqu'à présent, nous n'utilisions qu'un seul contexte EF, c'est donc celui qui est mappé dans la configuration Unity. Tout cela a été géré par l'injection de constructeurs et c'est quelque chose que nous aimerions maintenir pour la cohérence.Plusieurs implémentations IUnitOfWork dans un seul projet ASP.NET MVC

Nous avons maintenant introduit un autre Contexte EF pour notre PaymentController qui est utilisé dans le site mais Unity config ne permet actuellement que de créer un type pour IUnitOfWork.

Je sais que je peux créer un nouvel élément <register/> pour le nouveau contexte avec un attribut de nom distinct, mais comment puis-je l'implémenter dans le constructeur du contrôleur pour utiliser les paiements nommés?

<register type="IUnitOfWork" mapTo="FirstContext" /> 
    <register type="IUnitOfWork" mapTo="PaymentsContext" name="payments"/> 

    public class PaymentController() 
    { 
    public PaymentController(IUnitOfWork unitOfWork) 
    { 
     //How to I tell unity that this needs to be a payments 
     _unitOfWork = unitOfWork; 
    } 
    } 

Merci beaucoup

Répondre

0

Lorsque le FirstContext et PaymentsContext ont chacun un ensemble unique d'entités (par exemple, chaque connexion à une base de données différente), il est sauvage vaut la peine de définir explicitement dans le code. Une façon de le faire est en spécifiant une usine pour chaque unité de travail:

public interface IFirstContextFactory 
{ 
    IUnitOfWork CreateNew(); 
} 

public interface IPaymentContextFactory 
{ 
    IUnitOfWork CreateNew(); 
} 

public class PaymentController() 
{ 
    public PaymentController(PaymentContextFactory paymentContextFactory) 
    { 
     //How to I tell unity that this needs to be a payments 
     this.paymentContextFactory = paymentContextFactory; 
    } 

    public void DoSomething() 
    { 
     using (var context = this.paymentContextFactory.CreateNew()) 
     { 
     // Do something useful 

      context.Commit(); 
     } 
    } 
} 

fait Non seulement cela vos dépendances très claire (parce que vous savez quel type de contexte le code traite actuellement), mais il simplifie également la configuration DI, car vous n'aurez pas besoin d'enregistrements nommés.