5

Guardate la mia Controller (sto usando Dependency Injection per l'agenzia dipendenze):Controller MVC .NET con più repository e servizi?

public RoleController(IRoleRepository roleRepository, ISiteRepository siteRepository, IUserRepository userRepository, IDbContext dbContext) 
{ 
    _roleRepository = roleRepository; 
    _siteRepository = siteRepository; 
    _userRepository = userRepository; 
    _dbContext = dbContext; 
} 

Avere una classe con molte dipendenze è un odore di codice? Destra?

Tuttavia, nel mio esempio ho bisogno di associare Users e Sites in un Role, quindi ho bisogno di queste dipendenze per fare questa associazione.

Alcune persone su una mailing list mi hanno detto che avere troppe dipendenze è un segno che qualcosa è probabilmente sbagliato. Ma non vedo altro modo. Ho separato le mie responsabilità, c'è qualcosa in quella situazione che non so come trattare? Qualcosa non va?

Aggiornamento:

ho bisogno di repository e DbContext perché DbContext è il mio UnitOfWork, repository non salvano.

questo esempio è un semplice CRUD con alcune altre funzionalità come Associazioni in vista con una griglia.

Aggiornamento 2:

sto usando un'architettura in cui il mio livello di interfaccia utente è la MVC.

+1

Generalmente creo solo repository per le root aggregate, non per tutte le entità. Non conosco il tuo dominio, ma il mio istinto mi dice che hai troppi repository. Inoltre, perché hai bisogno dei repository E del dbcontext? Infine, di solito preferisco fare attività di tipo "orchestrazione" in un 'Servizio', e lasciare che il servizio gestisca i repository ecc. La dipendenza del controller diventa quindi solo sul servizio. – Brook

+0

@Brook vedi aggiornamento. –

+1

possibile duplicato di [In asp.net-mvc, c'è un modo più elegante di utilizzare IOC per iniettare repository multipli in un controller?] (Http://stackoverflow.com/questions/7311623/in-asp-net-mvc- è-there-a-more-elegant-way-using-ioc-to-iniettore-mutiple-repositor) – Omar

risposta

8

non credo che sia una cosa brutta, dato che di gestire le dipendenze con un buon quadro DI (cioè non utilizzando poor man's DI). In questo modo, dici esplicitamente che il controller avrà bisogno di tutte queste cose, perché lo farà. (Si noti che in molte altre parti della vostra applicazione, questo potrebbe non essere un argomento valido - il controller è speciale nel modo in cui è controllato e diretto il flusso del programma, quindi c'è una spiegazione naturale perché deve vedere un sacco di parti dell'applicazione ...)

Tuttavia, se davvero si vuole limitare il numero delle dipendenze in questo caso specifico, potrebbe avere senso per creare un MembershipService, che fa tutto il lavoro in questione con Users, Sites e Roles . Ciò avrebbe quindi una dipendenza da questi tre repository e il tuo controller avrebbe solo una dipendenza dal servizio di appartenenza.


In risposta alla tua aggiornamento: è possibile registrare l'unità di lavoro (vale a dire il contesto db) come un Singleton "per ogni richiesta web" - questo è possibile con il Castello di Windsor e molti altri quadri DI. Quindi puoi lasciare che i tuoi repository dipendano da esso e fare tutte le modifiche, e lasciare che il controllore dipenda da esso per il salvataggio, e riceveranno tutte la stessa istanza assegnata loro dal framework DI.

+0

vedi aggiornamento, il problema è che MVC è il mio UI Layer. L'argomento che ho ricevuto è: I controllori sono responsabili di rispondere alle richieste degli utenti e non dovrebbero in linea di principio essere collegati al tuo dominio. –