2013-06-04 3 views
3

Je suis un peu confus sur la façon dont cela fonctionnerait avec Unity. Supposons le scénario suivant, j'ai un contrôleur appelé TestController qui dépend de deux Services ServiceA et ServiceB. Maintenant, serviceA dépend de deux référentiels, RepositoryA1 et RepositoryA2. ServiceB dépend d'un référentiel, RepositoryB. Supposons en outre que ServiceA, RepositoryA1 et RepositoryA2 dépendent de UnitOfWork, UnitOfWork1. J'ai du mal à comprendre comment implémenter ceci pour MVC3 et le bloc d'application Unity. Quelqu'un pourrait-il donner un exemple de la façon dont cela devrait être codé?Comment injecter la couche de service dans le contrôleur lorsque la couche de service dépend du référentiel et UnitOfWork

Répondre

4

Il y a un avis de beaucoup sur cela, mais c'est la façon dont je travaille dehors pour moi

UnitOfWork

public interface IUnitOfWork : IDisposable 
{ 
    FooContext DbContext { get; } 
    void Save(); 
} 
public class UnitOfWork : IUnitOfWork 
{ 
    protected string ConnectionString; 
    private FooContext context; 

    public UnitOfWork(string connectionString) 
    { 
     this.ConnectionString = connectionString; 
    } 

    public FooContext DbContext 
    { 
     get 
     { 
      if (context == null) 
      { 
       context = new FooContext(ConnectionString); 
      } 
      return context; 
     } 
    } 
    ... 
} 

GenericRepository

public class GenericRepository<TEntity> : 
    IGenericRepository<TEntity> where TEntity : class 
{ 
    protected FooContext DbContext; 

    public GenericRepository(IUnitOfWork unitOfWork) 
    { 
     this.DbContext = unitOfWork.DbContext; 
    } 

    ... 
} 

dépôts génériques ici, mais ils pourraient tout aussi bien être construit pour être précis.

service

public class FooService : IFooService 
{ 
    private IUnitOfWork unitOfWork; 
    private IGenericRepository<Foo> fooRepository; 
    private IGenericRepository<Bar> barRepository; 

    public FooService(IUnitOfWork unitOfWork, 
         IGenericRepository<Foo> fooRepository, 
         IGenericRepository<Bar> barRepository) 
    { 
     this.unitOfWork = unitOfWork; 
     this.fooRepository = fooRepository; 
     this.barRepository = barRepository; 
    } 
} 

Vous devez toujours passer le IUnitOfWork pour avoir accès à la méthode Save. Je suppose que j'aurais pu l'obtenir de l'un des dépôts.

UnityConfig

var container = new UnityContainer(); 
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager(), 
    new InjectionConstructor(ConnectionString)); 
container.RegisterType(typeof(IGenericRepository<>), typeof(GenericRepository<>)); 
container.RegisterType<IFooService, FooService>(); 
container.RegisterType<IBarService, BarService>(); 

Contrôleur

private IFooService fooService; 
private IBarSevice barService; 

public HomeController(IFooService fooService, IBarService barService) 
{ 
    this.fooService = fooService; 
    this.barService = barService; 
} 
+0

Donc cela va injecter automatiquement le UnitOfWork dans le service et les dépôts? – user1790300

+0

@ user1790300 Oui, car chaque dépendance de la chaîne est enregistrée – Jasen

+0

Il serait pratique de faire des dépôts en tant que propriétés (avec chargement paresseux) de l'unité de travail. Donc, vous devez passer au service d'une unité de travail sans longue liste de référentiels. – eternity

Questions connexes