Un repository deve essere passato all'interfaccia utente

1

In Dependency Injection di Mark Seeman in .NET, inietta un repository nel suo livello di interfaccia utente. Credo che lo stia facendo in modo che possa archiviare tutto nella configurazione dell'interfaccia utente, tuttavia questo mi sembra un cattivo design. Non sarebbe meglio passare il riferimento di servizio nell'interfaccia utente? Che cosa impedisce a uno sviluppatore futuro di utilizzare direttamente il repository? Inoltre, dice che sta costruendo questo come un'architettura n-tier. Ma ora ha accoppiato il livello dati al livello dell'interfaccia utente (indipendentemente dal fatto che DI sia usato o meno). Cosa succede se vuole ospitare tutti e tre i livelli su diversi server autonomi. Mentre il suo approccio potrebbe funzionare, mi sembra sbagliato. Quindi, volevo vedere cosa ha da dire la comunità generale. Ho ragione nei miei pensieri, o mi sto perdendo qualcosa?

Versione semplificata del codice:

public class UI
{
  IRepository _repo;
  public UI(IRepository repo) 
  {
    _repo = repo;
  }

  public stuff UIMethod()
  {
    var svc = new Service(_repo);
    return svc.GetStuff();
  }
}

public class Service
{
  IRepository _repo;
  public Service(IRepository repo)
  {
    _repo = repo;
  }

  public stuff GetStuff()
  {
    var persistenceStuff = _repo.GetStuff();
    //Do some business logic here
    return persistenceStuff.ToServiceStuff();
  }
}
    
posta Justin Pihony 29.05.2013 - 16:30
fonte

2 risposte

3

imo, passare il repository attraverso il servizio è inutile. Perché avere il servizio, se hai intenzione di usare il repository?

Penso che ogni strato di astrazione debba essere pensato. Se non hai bisogno di un servizio, non averne uno. Se non hai bisogno di un repository (la maggior parte sono DAO comunque), non ne hai uno.

Sono d'accordo con te. Poiché il codice è valido, è un cattivo design. Dovrebbe o rimuovere il suo livello di servizio e fare riferimento al repository direttamente o utilizzare il servizio. In genere non si devono passare riferimenti di oggetti attraverso altri oggetti.

    
risposta data 29.05.2013 - 19:07
fonte
2

But, he has now coupled the data layer to the UI layer

Lo scopo di un repository è quello di disaccoppiare l'utente del repository (qui il livello dell'interfaccia utente) dal livello di persistenza o database - non dagli oggetti dati stessi. Ti aiuta, ad esempio, a fornire oggetti dati generati in memoria per scopi di test, senza la necessità di recuperarli da un vero database.

    
risposta data 29.05.2013 - 17:43
fonte