Dépôt de la Couche vous donne un niveau supplémentaire d'abstraction au-dessus d'accès aux données. Au lieu d'écrire
var context = new DatabaseContext();
return CreateObjectQuery<Type>().Where(t => t.ID == param).First();
pour obtenir un seul article de la base de données, vous utilisez référentiel d'interface
public interface IRepository<T>
{
IQueryable<T> List();
bool Create(T item);
bool Delete(int id);
T Get(int id);
bool SaveChanges();
}
et appelez - Get(id)
. Dépôt de la couche expose de base CRUD opérations.
La couche de Service expose la logique d'entreprise, qui utilise le référentiel. Exemple de service qui pourrait ressembler à:
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);
}
Alors qu' List()
méthode de référentiel renvoie à tous les utilisateurs, ListUsers()
de IUserService pourrait renvoyer uniquement, l'utilisateur a accès.
Dans ASP.NET MVC + EF + SQL SERVER, j'ai ce flux de communication:
Vues <- Contrôleurs -> couche de Service -> Dépôt de la couche -> EF -> SQL Server
La couche de Service -> Dépôt de la couche -> EF Cette partie fonctionne sur les modèles.
Vues <- Contrôleurs -> couche de Service de Cette partie fonctionne sur les modèles de vue.
EDIT:
Exemple de flux de /Commandes/ByClient/5 (nous voulons voir l'ordre de client spécifique):
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);
}
}
C'est l'interface de commande de service:
public interface IOrderService
{
OrdersByClientViewModel GetByClient(int id);
}
Cette interface renvoie au modèle de vue:
public class OrdersByClientViewModel
{
CientViewModel Client { get; set; } //instead of ClientView, in simple project EF Client class could be used
IEnumerable<OrderViewModel> Orders { get; set; }
}
C'est l'implémentation de l'interface. Il utilise des classes de modèle et de référentiel pour créer de modèle de vue:
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...}
}
);
}
}