2017-04-08 2 views
1

J'ai une architecture à 3 couches.La couche de gestion métier d'un module peut-elle accéder directement au référentiel d'un autre module?

1) C# MVC Application - couche d'interface utilisateur

2) Couche d'affaires - comprenant des interfaces de service et sa mise en œuvre et les interfaces du référentiel

3) Accès aux données couche - comprenant la mise en œuvre de l'interface Repository

L'application est divisée en différents modules. Un module n'est rien d'autre qu'une bibliothèque de classe C#. Chaque module a sa propre couche de gestion et sa propre couche d'accès aux données. Il y a un faible couplage entre les couches, de sorte que chaque couche accède à l'autre par l'intermédiaire de l'interface seulement. Pour vous donner un exemple, voici comment l'application est empilé

// UI layer 
public class UserController: Controller 
{ 
    IUserService userService; 
    IOrderService orderService; 

    public UserController(IUserService userService, IOrderService orderService){ 
    this.userService = userService; 
    this.orderService = orderService; 
    } 
} 

//Business layer - User module 
public class UserService: IUserService 
{ 
    IUserRepository userRepository; 
    IOrderRepository orderRepository; 

    public UserService(IUserRepository userRepository, IOrderRepository 
    orderRepository){ 
     this.userRepository = userRepository; 

     //Should this be here or replaced by order service ? 
     this.orderRepository = orderRepository; 
    } 
} 

//Business layer - Order module 
public class OrderService: IOrderService 
{ 
    IOrderRepository orderRepository; 

    public UserService(IOrderRepository orderRepository){ 
     this.orderRepository= orderRepository; 
    } 
} 

//Data access layer - User module 

public class UserRepository: IUserRepository { 
} 

//Data access layer - Order module 

public class OrderRepository: IOrderRepository { 
} 

Est-il acceptable pour le service de l'utilisateur pour accéder directement au référentiel de commande ou devrait-elle avoir une dépendance au service de la commande seulement?

+0

Il est recommandé d'utiliser le service plutôt que le référentiel, car les services ont une logique métier à exécuter avant d'effectuer une opération de base de données. Mais vous devez faire attention ici que les deux services ne doivent pas être dépendants l'un de l'autre, sinon vous finirez dans l'impasse. –

Répondre

1

Vous accédez IOrderRepository à UserService. Votre question est de savoir si cette approche est correcte, ou il devrait seulement accéder IUserRepository et appeler OrderService au lieu de IOrderRepository.

OMI, tout service peut appeler un dépôt selon le besoin. Il n'y a pas de relation 1 <-> 1 entre le service et le référentiel.

Le référentiel vous fournit un accès aux données. Si un tel accès est nécessaire dans plusieurs services, plusieurs services peuvent consommer le même référentiel. Cela a l'air très propre et explicable.