1. ホーム
  2. asp.net-mvc

[解決済み】リポジトリとサービスレイヤーの違い?

2022-04-10 08:24:33

質問

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

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

どのように解決するのですか?

リポジトリレイヤーは、データアクセスに対する追加の抽象化レベルを提供します。代わりに

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 この部分はモデルに対して操作します。

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

EDITです。

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...}     
             }
         );
     }
}