2011-12-16 4 views
6

Ho la seguente configurazione: MVC> Servizi> Archivi. Ora voglio consentire agli utenti di aggiungere una nota a un documento. Solo gli utenti associati al documento (sia come proprietari o revisori) possono aggiungere note così nel mio NoteService faccio quanto segue per verificare che l'utente disponga dell'autorizzazione sul documento selezionato:Aggiunta di metodi alle classi POCO

public Note GetNewNote(int documentID) 
    { 
     if (!userHasAccess(Thread.CurrentPrincipal.Identity.Name)) 
      throw new BusinessLogicException(); 

     // Other stuff here... 
    } 

La mia domanda è, dove dovrei definire il metodo userHasAccess? Non ha senso nel NoteService poiché sta controllando un documento. Potrei definirlo nel DocumentService ma poi NoteService avrà bisogno di accedere a ciò che sembra introdurre più accoppiamento.

Per me ha più senso definirlo sul documento POCO stesso e quindi chiamare document.userHasAccess (...). Sarebbe una buona pratica o un dominio POCO dovrebbe essere limitato a proprietà semplici? Sono preoccupato che questo sia davvero parte della validazione e che ponendo il metodo nel POCO sto separando la validazione tra Service e POCO.

Quello che sto cercando di garantire è che la mia applicazione sia facile da mantenere e da testare. Qualche suggerimento su come dovrei affrontarlo sarebbe molto apprezzato!

+0

Che tipo di controllo non userHasAccess fare? Code Access Security potrebbe funzionare per te. – jgauffin

+0

Controlla semplicemente che l'utente sia in Document.Owners o Document.Reviewers - sono molte le relazioni tra documento e persona. – James

risposta

7

Dove devo definire il metodo userHasAccess?

Ha senso per essere coerente con il resto del design, mentre io non so il disegno completo posso almeno dire che un metodo chiamato UserHasAccess() sul POCO in sé ha un senso.

Un dominio POCO deve essere limitato a proprietà semplici?

No, un dominio POCO deve contenere la logica (in particolare la logica di convalida) relativa all'oggetto. Altrimenti, finisce per essere un object with no behaviour - qualcosa che dovresti assolutamente evitare.

Tuttavia, non confondersi tra un oggetto dominio (business) e un oggetto vista, che in genere contiene poca logica.

È preoccupante che si stia separando la convalida tra il servizio e POCO.

Metterei la convalida nel POCO e la logica tra domini nei servizi.

+0

Grazie per la risposta e il collegamento. Solo per spingere questo su un po 'di ulteriore, che tipo di convalide tendono ad andare in POCOs? Sono cose del mio esempio, semplici metodi che vengono poi chiamati da un servizio? Quindi un Servizio può chiamare quelli necessari per determinare se un'eccezione di validazione (o qualsiasi altra cosa) dovrebbe essere lanciata al controller? O dovrebbe esserci qualche sorta di metodo di convalida sui miei POCO? – James

+0

Avrei un metodo di convalida su ogni POCO - ha senso che un POCO sappia se è valido. Il tuo esempio è un po 'diverso e ha senso essere un metodo stesso. –

+0

L'idea del metodo di convalida mi confonde perché diversi metodi di servizio richiedono cose diverse per chiamare il POCO valido. Con il mio esempio, userHasAccess chiede semplicemente al POCO se possiamo fare qualcosa mentre un metodo valido nella mia mente farebbe i controlli come "username deve essere univoco". Non inizia a legare il POCO con EntityFramework? – James

0

Qualsiasi entità di dominio può contenere anche metodi di convalida.

+1

Questa buona pratica è questa?Non voglio iniziare ad aggiungere questi metodi apparentemente semplici alle mie classi POCO solo per scoprire in seguito che diventa difficile da mantenere/testare. Sarebbe bello mantenere tutte le convalide in una sezione - con l'esempio precedente dovrei solo controllare se l'utente è nel documento. Proprietari e poi se nel documento.Reviewer ma dovrò ripetere questa logica ancora e ancora così ha bisogno di essere il suo metodo – James

0
  1. Se si segue Pattern modello di dominio, è possibile aggiungere attributi con comportamenti. controllare questo Martin fowler
  2. Se si sta seguendo Tabella modello Modulo poi aggiungere i comportamenti in classe BLL e gli attributi in POCO controllo questo così da Martin fowler