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