2017-04-08 5 views
1

Ich habe eine 3-Schicht-Architektur.Kann die Business-Schicht eines Moduls direkt auf das Repository eines anderen Moduls zugreifen?

1) C# MVC Anwendung - UI-Ebene

2) Business Layer - bestehend aus Service-Schnittstellen und deren Umsetzung und Repository-Schnittstellen

3) Data Access Layer - bestehend aus Repository Interface-Implementierung

Die Anwendung ist in verschiedene Module unterteilt. Ein Modul ist nichts anderes als eine C# -Klassenbibliothek. Jedes Modul verfügt über eine eigene Business-Schicht und Datenzugriffsebene. Es gibt eine lose Kopplung zwischen den Schichten, so dass jede Schicht nur über die Schnittstelle auf die andere zugreift. nur, um Ihnen ein Beispiel, hier ist, wie die Anwendung besteht gestapelt

// 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 { 
} 

Ist es OK für den User-Dienst, um direkt den Auftrag Repository zugreifen oder sollte es die Abhängigkeit von der Bestellservice haben?

+0

Es empfiehlt sich, den Dienst anstelle des Repositorys zu verwenden, da die Dienste vor dem Ausführen eines Datenbankvorgangs eine Geschäftslogik ausführen müssen. Aber Sie müssen hier vorsichtig sein, dass beide Dienste nicht voneinander abhängig sein sollten, sonst landen Sie in einem Deadlock. –

Antwort

1

Sie greifen auf IOrderRepository in UserService zu. Ihre Frage ist, ob dies der richtige Ansatz ist, oder es sollte nur auf IUserRepository zugreifen und OrderService anstelle von IOrderRepository aufrufen.

IMO, jeder Dienst kann jedes Repository nach Bedarf aufrufen. Es gibt keine 1 <-> 1 Beziehung zwischen Service und Repository.

Repository bieten Ihnen einen Zugriff auf Daten. Wenn ein solcher Zugriff in mehreren Diensten erforderlich ist, können mehrere Dienste dasselbe Repository verwenden. Das sieht sehr sauber und erklärbar aus.

Verwandte Themen