2017-04-08 16 views
1

私は3層アーキテクチャを採用しています。あるモジュールのビジネスレイヤーは、別のモジュールのリポジトリに直接アクセスできますか?

1)C#MVCアプリケーション - UI層

2)ビジネスレイヤ - サービス・インターフェースとその実装とリポジトリインターフェース

3)データアクセス層からなる - リポジトリインタフェースの実装からなる

アプリケーションは異なるモジュールに分割されています。モジュールは、C#クラスライブラリだけです。各モジュールには、独自のビジネスレイヤーとデータアクセスレイヤーがあります。レイヤー間の疎結合があるため、各レイヤーはインターフェイスを介して他のレイヤーにアクセスします。ここで、あなたの例を与えるためには、アプリケーションが

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

それが直接注文リポジトリにアクセスするためのユーザー・サービスのためのOKですか、それが唯一の注文サービスに依存している必要があり積み上げている方法ですか?

+0

サービスにはデータベース操作を実行する前に実行するビジネスロジックがあるため、リポジトリの代わりにサービスを使用するとよいでしょう。しかし、ここでは両方のサービスが互いに依存してはならないことに注意する必要があります。それ以外の場合は、デッドロック状態になります。 –

答えて

1

IOrderRepositoryにはUserServiceでアクセスしています。あなたの質問は、これが正しいアプローチかどうかですか、それともIUserRepositoryにアクセスし、IOrderRepositoryの代わりにOrderServiceに電話する必要があります。

IMOでは、どのサービスも必要に応じて任意のリポジトリを呼び出すことができます。サービスとリポジトリの間には、1 <-> 1の関係はありません。

リポジトリは、データへのアクセスを提供します。このようなアクセスが複数のサービスで必要な場合、複数のサービスが同じリポジトリを消費する可能性があります。これは非常にきれいで説明できます。

関連する問題