Уровень репозитория дает вам дополнительный уровень абстракции над доступом к данным. Вместо написания
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...}
}
);
}
}