Arquitetura N-Camada com Camada de Serviço, Camada de Negócios e Entity Framework

Só queria algum feedback / ajuda com a maneira como estou arquitetando meu aplicativo. Minha estrutura de solução atual é algo como isto:

UI (aplicação MVC real)Core (apenas controladores e ViewModels)ServiçosBLLDados (Estrutura de Entidade DbContext, mapeada para objetos do Domínio)Domínio (objetos POCO simples)Interfaces

Outras coisas

Ninject para injetar DbContext no controlador (por solicitação)AutoMapper para mapear objetos Domain para ViewModel

Todos os assemblies têm uma referência ao projeto Interfaces, que, como o nome sugere, nada mais é do que interfaces simples (ou seja, IDbContext, IRepository, etc).

O projeto de serviços "liga" todo o resto. É o único assembly que tem uma referência direta à camada de acesso a dados (Entity Framework).

Eu forneci algum código abaixo:

Um exemplo de controlador é assim:

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));
        }
        ...

A classe 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, a classe da camada de negócios:

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();
        }
        ...

Estou procurando algum feedback / maneiras de melhorar. Percebo que para as tarefas básicas, os métodos da minha camada de serviço serão exatamente os mesmos que os métodos da camada de negócios (por exemplo, "passar por" funções). O que eu espero é que essa abstração seja útil para tarefas mais complexas que podem exigir chamadas para vários métodos da camada de negócios. Seria melhor incluir a lógica de negócios na camada de serviço?

questionAnswers(4)

yourAnswerToTheQuestion