Arquitectura N-Tier con Service Layer, Business Layer y Entity Framework

Solo quería algunos comentarios / ayuda con la forma en que estoy diseñando mi aplicación. Mi estructura de solución actual se ve algo como esto:

UI (aplicación MVC actual)Núcleo (solo controladores y ViewModels)ServiciosBLLDatos (Entity framework DbContext, asignado a objetos de dominio)Dominio (objetos POCO simples)Interfaces

Otras cosas

Proyecto para inyectar DbContext en el controlador (por solicitud)AutoMapper para asignar objetos de dominio a ViewModel

Todos los ensamblajes tienen una referencia al proyecto Interfaces, que, como su nombre indica, no es más que interfaces simples (es decir, IDbContext, IRepository, etc.).

El proyecto de Servicios "une" todo lo demás. Es el único conjunto que tiene una referencia directa a la capa de acceso a datos (Entity Framework).

He proporcionado algunos códigos a continuación:

Un ejemplo de un controlador se ve así:

namespace Core.Controllers
{
    public class HomeController : Controller
    {
        private IDbContext dbContext;

        public HomeController(IDbContext dbContext)
        {
            this.dbContext = dbContext;
        }

        public ActionResult Users()
        {
            UserService userService = new UserService(dbContext);
            var users = userService.GetAllUsers();
            return View(Mapper.Map<IEnumerable<UserListViewModel>>(users));
        }
        ...

La clase UserService:

namespace Services
{
    public class UserService
    {
        private readonly IDbContext dbContext;

        public UserService(IDbContext dbContext)
        {
            this.dbContext = dbContext;
        }

        public IEnumerable<User> GetAllUsers()
        {
            IRepository<User> userRepository = new Repository<User>(dbContext);
            UserBLL userBLL = new UserBLL(userRepository);
            return userBLL.GetAllUsers();
        }
        ...

Finalmente, la clase de capa de negocios:

namespace BLL
{
    public class UserBLL
    {
        private readonly IRepository<User> userRepository;

        public UserBLL(IRepository<User> userRepository)
        {
            this.userRepository = userRepository;
        }

        public IEnumerable<User> GetAllUsers()
        {
            return userRepository.Get();
        }
        ...

Estoy buscando algunos comentarios / formas de mejorar. Observo que para las tareas básicas, mis métodos de la capa de servicio serán exactamente los mismos que los métodos de la capa de negocios (es decir, funciones de "paso a través"). Lo que espero es que esta abstracción sea útil para tareas más complejas que pueden requerir llamadas a múltiples métodos de capa empresarial. ¿Sería mejor incluir la lógica de negocios en la capa de servicio?

Respuestas a la pregunta(4)

Su respuesta a la pregunta