¿Cuál es la diferencia entre una capa de servicio y un repositorio? He trabajado en muchas aplicaciones demo de ASP.NET MVC y la mayoría de ellas solo tienen repositorios. Y algunos tienen una mezcla de ambos. ¿Cuándo utiliza repositorios simples y cuándo usa servicios/o ambos? Lo mismo es cierto para las aplicaciones web ASP.NET.Service ASP.NET vs capas de repositorio
Respuesta
repositorios actúan igual que las puertas de enlace a su almacenamiento de datos (base de datos SQL, archivo XML, etc.) mientras que los servicios por lo general por lo implementan Me reglas comerciales sobre sus datos antes de enviar los datos a guardar en la base de datos a través de un repositorio.
Considere este ejemplo:
class UserRepository : IUserRepository
{
public void Create(User userToCreate)
{
//update tracking and save to repository
_userToCreate.DateCreated = DateTime.Now;
_dataContext.AddNew(userToCreate);
}
}
class UserService : IUserService
{
private IUserRepository _repository;
public UserService(IUserRepository repository)
{
_repository = repository;
}
public void Create(User createdByUser, User userToCreate)
{
//implement some business rules
if(!createdByUser.HasRights(UserRights.CanCreateNewUser))
throw new Exception("This user '"+createdByUser.Name+"' does not have the rights to create a new user");
//update rules auditing
_userToCreate.CreatedByUserId = createdByUser.Id;
//save entity to repository
_repository.Create(userToCreate);
}
}
Luego, en su acción de controlador que va a utilizar el servicio directamente, donde se pueden aplicar todas las reglas de negocio. De esta forma, puede probar sus controladores, reglas comerciales (servicios) y persistencia (repositorios) por separado/de forma independiente utilizando simulaciones.
public ActionResult CreateUser(User newUser)
{
if(ModelState.IsValid)
{
_userService.Create(this.CurrentUser, newUser);
if(newUser.Id > 0)
return RedirectToAction("UserCreated");
}
return View(newUser);
}
Un repositorio normalmente solo maneja el acceso a datos. Una capa de servicio usará un repositorio y aplicará cualquier lógica comercial adicional. Piense en el repositorio como una capa reutilizable que podría ser utilizado por cualquier cosa que quiera acceder a sus datos. Diferentes aplicaciones pueden tener diferentes reglas de negocio (que iría en la capa de servicio), pero todos podían usar la misma capa implmentation repositorio
¿Dónde colocarías tus repositorios y servicios? ¿Cómo es tu estructura de proyecto? Tengo MyProject.BusinessObjects y MyProject.DataObjects. Actualmente tengo mis repositorios en MyProject.BusinessObjects. –
me gusta poner mi modelo de dominio (entidad marco edmx, por ejemplo) y las clases de repositorio en un proyecto independiente MyProject.Data. Usualmente mis servicios viven dentro del proyecto MVC Web App, en una carpeta/Services (pero no necesariamente consideraría una mejor práctica, solo una preferencia personal) – kenwarner
@qntmfred: La lógica de negocios de datos debe estar en el mismo proyecto que MyProject .Data, de lo contrario terminaría duplicando la lógica comercial en las aplicaciones web que dependen del proyecto MyProject.Data. – Alkaline
Así como un compendio de qntmfred respuesta por favor echar un vistazo a los siguientes recursos:
- 1. Repositorio git "Capas"
- 2. WCF Service vs ASP.NET Web Api
- 3. WCF Service vs Windows Service
- 4. Service vs. Repository
- 5. BroadcastReceiver vs Service
- 6. Android: AsyncTask vs Service
- 7. Java Utility Class vs. Service
- 8. Responsabilidades de las capas de Servicio y Repositorio
- 9. OpenLayers, capas: baldosa vs solo azulejo
- 10. nServiceBus vs Mass Transit vs Rhino Service Bus vs otro?
- 11. ¿El filtrado de datos tiene lugar en las capas de controlador, servicio o repositorio?
- 12. DDD Authentication Service
- 13. Android: ¿Cuándo usar Service vs Singleton?
- 14. MSMQ vs SQL Server Service Broker
- 15. Web hosting WAS vs Windows Service
- 16. Repositorio genérico ASP.NET MVC
- 17. comparar repositorio vs proveedor vs servicio
- 18. Difference asp.net web service and Ihttphandler
- 19. Módulos vs capas en la estructura del paquete de Java
- 20. Repositorio vs Acceso a datos
- 21. Repositorio vs base de datos vs sistema de archivos
- 22. .NET vs ASP.NET vs CLR vs ASP
- 23. ASP.NET MVC vs. ASP.NET 4.0
- 24. ASP.NET MVP vs ASP.NET MVC
- 25. ASP.Net MVC vs ASP.Net Formularios
- 26. arquitectura de 3 capas: paso de datos entre capas
- 27. Mejor patrón de repositorio para ASP.NET MVC
- 28. de varias capas ExpandableListView
- 29. ¿Cómo se usa Autofac en una aplicación web de 3 capas (ASP.NET MVC)?
- 30. Long-polling vs Apple Push Notification Service & Android C2DM
¿La capa de servicio siempre tendrá un nombre de método correspondiente en el repositorio? –
No necesariamente. Considere el Repositorio como un grupo de consultas. Por ejemplo, la capa de repositorio puede tener ** IQueryable GetUsers ** pero la capa de servicio puede tener más métodos que usan solo esta misma consulta. p.ej. ** IList GetUsers (int companyId, int pageNo) **, ** Usuario FindUser (int companyId, string name) **, ** bool HasUsers (companyId) ** etc. –
Tawani
Me gusta la noción de que la capa de servicio maneje la lógica de negocios, eliminándola de los métodos/controladores de acción. Gracias por las sugerencias de Tawani. – beaudetious