Modelli, controller e riutilizzo del codice

2

Ho un blog in cui gli utenti possono postare commenti.

Quando crei un commento, accadono varie cose:

  • creazione dell'oggetto commento, associazioni, persistente
  • invio di email di notifica all'autore del post, date le sue preferenze
  • invio di notifiche ai moderatori in base alle loro preferenze
  • aggiornamento di un database fulltext per la ricerca
  • ...

Potrei inserire tutto questo nel controller, ma cosa succede se voglio riutilizzare questo codice? per esempio. Vorrei fornire un'API per postare commenti.

Potrei anche inserire questo nel modello, ma mi chiedo se non perderò la flessibilità facendo così. E sarebbe accettabile fare tutto questo dal livello del modello?

Che cosa faresti?

    
posta user11715 25.02.2011 - 23:17
fonte

4 risposte

2

È possibile utilizzare il pattern Event-Observer per questo: inviare un evento a cui è stato salvato un messaggio e consentire agli osservatori di quell'evento di eseguire le azioni richieste (ad es. inviare notifiche, aggiornare la ricerca full-text): link

    
risposta data 28.02.2011 - 13:35
fonte
1

Sto pensando di farlo in questo modo:

[ControllerMethod]
PostComment (CommentModel comment)
{
    CommentsRepository.SaveComment (comment);

    NotificationBusinessLogic.SendPostAuthorNotification (comment);
    NotificationBusinessLogic.SendAdministratorNotification (comment);

    OperationBusinessLogic.UpdateFullTextSearch ();
}

È quindi possibile esporre qualsiasi metodo BL che sembri appropriato per gli utenti esterni e attraverso questo raggiungere il riutilizzo.

    
risposta data 25.02.2011 - 23:25
fonte
1

Il tuo controller dovrebbe chiamare un metodo nel tuo livello aziendale passandogli i parametri necessari per effettuare un salvataggio del commento.

Il metodo del livello aziendale è il metodo "orchestrazione". Sa cosa fare e sa cosa deve fare tutto. Questo metodo a sua volta può chiamare altri metodi privati / pubblici o il metodo di oggetti specializzati per portare a termine il lavoro.

Il punto chiave è che le regole aziendali di ciò che deve accadere quando un commento viene salvato sono incapsulate in un metodo del livello aziendale. Altri controller possono chiamare questo metodo senza dover sapere tutto ciò che deve essere fatto. Allo stesso modo, se è necessario aggiungere ulteriori passaggi nel processo, è sufficiente modificare l'implementazione nel livello aziendale.

public class BusinessLayer
{
  public int SaveComment(Comment comment)
  {
    DataLayer.SaveComment(comment);
    NotificationsManager.SendPostAuthorCommentNotification(comment.PostId);
    NotificationsManager.SendModeratorNotification(comment.PosId)
    SearchManager.InsertIntoFullTextIndex(comment.Id, comment.Description);
  }
}

A proposito, queste notifiche e l'indicizzazione del testo completo ecc. dovrebbero essere fatte "fuori banda". Significa che dovresti eseguire un processo esterno per eseguire effettivamente tutto il lavoro. Ad esempio, potresti pubblicare un "messaggio" in una coda di messaggi MSMQ. Ci vuole un istante per pubblicare un messaggio e l'utente che ha postato il commento non aspetta che tutta l'elaborazione sia completata.

È quindi possibile avere un altro processo (o processi) che elabora i messaggi in MSMQ. Questi processi possono impiegare il loro dolce momento per portare a termine il lavoro e questi processi possono utilizzare lo stesso Business Layer (se necessario) oi "manager" per portare a termine il lavoro.

Il design consentirà alla tua applicazione di scalare e quelli che postano commenti vedranno tempi di risposta minimi.

    
risposta data 28.02.2011 - 12:05
fonte
1

Se disponi di questo codice nei controller, avresti un dominio aenemico e non avresti la corretta separazione di Le preoccupazioni.

I controller sono nel livello di presentazione della tua applicazione e dovrebbero occuparsi dell'input / output. I modelli sono nel livello di dominio e sono un candidato più appropriato per contenere la logica aziendale.

    
risposta data 28.02.2011 - 13:40
fonte

Leggi altre domande sui tag