リポジトリとサービス層の違いは?質問する

リポジトリとサービス層の違いは?質問する

OOP デザイン パターンにおいて、リポジトリ パターンとサービス レイヤーの違いは何ですか?

私は ASP.NET MVC 3 アプリに取り組んでおり、これらのデザイン パターンを理解しようとしていますが、まだ理解できていません...!!

ベストアンサー1

リポジトリレイヤーは、データアクセスの抽象化をさらに高めます。

var context = new DatabaseContext();
return CreateObjectQuery<Type>().Where(t => t.ID == param).First();

データベースから単一のアイテムを取得するには、リポジトリインターフェースを使用します。

public interface IRepository<T>
{
    IQueryable<T> List();
    bool Create(T item);
    bool Delete(int id);
    T Get(int id);
    bool SaveChanges();
}

を呼び出しますGet(id)。リポジトリ レイヤーは基本的なCRUD操作を公開します。

サービス層は、リポジトリを使用するビジネス ロジックを公開します。サービスの例は次のようになります。

public interface IUserService
{
    User GetByUserName(string userName);
    string GetUserNameByEmail(string email);
    bool EditBasicUserData(User user);
    User GetUserByID(int id);
    bool DeleteUser(int id);
    IQueryable<User> ListUsers();
    bool ChangePassword(string userName, string newPassword);
    bool SendPasswordReminder(string userName);
    bool RegisterNewUser(RegisterNewUserModel model);
}

List()リポジトリのメソッドはすべてのユーザーを返しますが、 ListUsers()IUserService はユーザーがアクセスできるユーザーのみを返します。

ASP.NET MVC + EF + SQL SERVER では、次の通信フローが存在します。

ビュー <- コントローラー -> サービス層 -> リポジトリ層 -> EF -> SQL Server

サービス層 -> リポジトリ層 -> EFこの部分はモデルに対して操作します。

ビュー <- コントローラー -> サービス層この部分はビュー モデルを操作します。

編集:

/Orders/ByClient/5 のフローの例 (特定のクライアントの注文を確認したい):

public class OrderController
{
    private IOrderService _orderService;

    public OrderController(IOrderService orderService)
    {
        _orderService = orderService; // injected by IOC container
    }

    public ActionResult ByClient(int id)
    {
        var model = _orderService.GetByClient(id);
        return View(model); 
    }
}

これは注文サービスのインターフェースです:

public interface IOrderService
{
    OrdersByClientViewModel GetByClient(int id);
}

このインターフェースはビューモデルを返します:

public class OrdersByClientViewModel
{
     CientViewModel Client { get; set; } //instead of ClientView, in simple project EF Client class could be used
     IEnumerable<OrderViewModel> Orders { get; set; }
}

これはインターフェースの実装です。モデル クラスとリポジトリを使用してビュー モデルを作成します。

public class OrderService : IOrderService
{
     IRepository<Client> _clientRepository;
     public OrderService(IRepository<Client> clientRepository)
     {
         _clientRepository = clientRepository; //injected
     }

     public OrdersByClientViewModel GetByClient(int id)
     {
         return _clientRepository.Get(id).Select(c => 
             new OrdersByClientViewModel 
             {
                 Cient = new ClientViewModel { ...init with values from c...}
                 Orders = c.Orders.Select(o => new OrderViewModel { ...init with values from o...}     
             }
         );
     }
}

おすすめ記事