Sto lavorando con Visual Studio. La soluzione contiene i seguenti 4 progetti:
DAL
Funziona con Entity framework + Pattern di repository. Contiene le classi DB + Repositorys.
BLL
Contiene le classi DTO + Servizi. I servizi associano le classi DTO alle classi DB. Fa riferimento al progetto DAL.
IMessageRepository messageRepo;
public MessageService()
{
    this.messageRepo = new MessageRepository();
    AutoMapper.Mapper.Initialize(cfg => cfg.AddProfile<AutoMapperProfile>());
}
public MessageService(IMessageRepository repo)
{
    this.messageRepo = repo;
    AutoMapper.Mapper.Initialize(cfg => cfg.AddProfile<AutoMapperProfile>());
}
public List<DTO.Message> GetAll()
{
    List<DTO.Message> messages = ((System.Linq.IQueryable<DAL.Message>)messageRepo.GetAll()).ProjectTo<DTO.Message>().ToList();
    return messages;
}
Presentazione
Fa riferimento al progetto BLL e a EntityFramework.SqlServer.dll.
MessageService ms = new MessageService();
List<Message> messages = ms.GetAll();
Bonus: test unitari
Fa riferimento al progetto BLL e al progetto DAL (deride i repositorys)
[TestClass]
public class MessageServiceTest
{
    Mock<IMessageRepository> messageRepo;
    MessageService messageService;
    [TestInitialize]
    public void SetUp()
    {
        // Create a new mock of the repository
        messageRepo = new Mock<IMessageRepository>();
        // Set up the mock for the repository
        messageRepo.Setup(x => x.GetAll()).Returns((new List<DAL.Message>
        {
            new DAL.Message { Id = 1, Content = "Hello world!", Date = DateTime.Now },
            new DAL.Message { Id = 2, Content = "I <3 U!", Date = DateTime.Now }
        }).AsQueryable());
        // Create the service and inject the repository into the service
        messageService = new MessageService(messageRepo.Object);
    }
    [TestMethod]
    public void TestGetAll()
    {
        // Act
        var messages = messageService.GetAll();
        // Assert
        Assert.AreEqual(2, messages.Count, "The messages count is not correct");
    }
}
Sono nuovo nell'architettura del software. Quali sono i tuoi pensieri su questa architettura? Qualche miglioramento?