La mia architettura a tre livelli è ben implementata?

2

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?

    
posta ptiflo 16.06.2018 - 08:27
fonte

1 risposta

3

La tua classe di servizio è ridondante. Il repository deve restituire l'oggetto "reale", non l'oggetto EF.

Effettua tutti i tuoi recuperi e mappature all'interno del tuo repository.

Il tuo test di unità non esegue realmente alcun test tranne la tua configurazione di simulazione. È persino possibile che la mappatura fallisca?

Salterò il test unitario su un repository e passerò direttamente ai test di integrazione; come il suo SQL e la creazione di oggetti in cui ottieni il maggior numero di bug.

Entity Framework ha un lotto di problemi man mano che aumenti. Se lo nascondi dietro un repository perdi i (cosiddetti) vantaggi di cose come IQueryable, il caricamento lazy e la creazione e mappatura automatica alle classi.

Lo eliminerei e userei SqlClient e DataReader per popolare manualmente i tuoi DTO.

Non è chiaro se i tuoi DTO sono i tuoi modelli o se hai altri modelli con la logica che usi utilizzando i DTO. O se stai mettendo i tuoi modelli in un progetto separato? (che consiglierei)

Inoltre dovresti davvero avere un progetto Database con l'installazione del database al suo interno. Troppo spesso le persone salta questo, creando il database manualmente e poi quando si desidera distribuire una nuova istanza o aggiungere una tabella o qualcosa che non si ha controllo di origine e percorso di distribuzione.

Nel complesso, chiedi del tuo progetto a tre livelli, ma hai solo mostrato il datalayer.

Ps. Vorrei cambiare tutti i metodi del repository in async Task < >

    
risposta data 16.06.2018 - 21:24
fonte

Leggi altre domande sui tag