更新时间:2023-02-13 15:00:28
Repository Layer 为您提供了对数据访问的额外抽象级别.而不是写
Repository Layer gives you additional level of abstraction over data access. Instead of writing
var context = new DatabaseContext();
return CreateObjectQuery<Type>().Where(t => t.ID == param).First();
要从数据库中获取单个项目,请使用存储库接口
to get a single item from database, you use repository interface
public interface IRepository<T>
{
IQueryable<T> List();
bool Create(T item);
bool Delete(int id);
T Get(int id);
bool SaveChanges();
}
并调用Get(id)
.存储库层公开基本的CRUD 操作.
and call Get(id)
. Repository layer exposes basic CRUD operations.
服务层暴露业务逻辑,使用存储库.示例服务可能如下所示:
Service layer exposes business logic, which uses repository. Example service could look like:
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);
}
虽然repository的List()
方法返回所有用户,但IUserService的ListUsers()
只能返回一个,用户可以访问.
While List()
method of repository returns all users, ListUsers()
of IUserService could return only ones, user has access to.
在 ASP.NET MVC + EF + SQL SERVER 中,我有这样的通信流程:
In ASP.NET MVC + EF + SQL SERVER, I have this flow of communication:
视图 <- 控制器 -> 服务层 -> 存储库层 -> EF -> SQL Server
Service layer -> Repository layer -> EF 这部分对模型进行操作.
Service layer -> Repository layer -> EF This part operates on models.
Views <- Controllers -> Service layer 这部分操作在视图模型上.
Views <- Controllers -> Service layer This part operates on view models.
/Orders/ByClient/5 的流程示例(我们希望查看特定客户的订单):
Example of flow for /Orders/ByClient/5 (we want to see order for specific client):
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; }
}
这是接口实现.它使用模型类和存储库来创建视图模型:
This is interface implementation. It uses model classes and repository to create view model:
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...}
}
);
}
}