Servizio di posta elettronica o semplicemente e-mail astratta e chiamata da?

1

Ho ottenuto un'applicazione web abbastanza grande in asp.net usando C #. Inoltre, disponi di una configurazione mobile che utilizza un'API comune che abbiamo scritto per condividere fondamentalmente i dati su entrambe le nostre app utilizzando metodi web e classi comuni.

L'email è stata inizialmente generata insieme in forse due giorni utilizzando una semplice classe email e alcune proprietà di base.

Ad esempio, una volta creato un record, inviamo un'email. Immagina un sistema di tipo crm tale che, quando viene creato un account o un cliente, venga inviata un'e-mail. La cosa che non mi piace di più è che la chiamiamo direttamente all'interno, ad esempio il livello di presentazione:

MyAPI.SaveCompany(company object);
Email.SendMail(...);

Per l'applicazione mobile abbiamo un servizio web per salvare ad esempio un'azienda come sopra. Quindi, come mostrato sopra dopo aver salvato un'azienda, facciamo la stessa cosa Email.SendMail direttamente nel metodo web.

È ora di sistemare tutto ciò che mi sembra sbagliato. Cosa raccomandi di fare?

  • Se questo è un servizio autonomo che invia e-mail in base agli eventi in una tabella di database che tiene traccia di tutti questi eventi,

  • O dovrei semplicemente creare una classe email come ho già fatto e chiamarla da qualche altra parte?

Ho pensato di chiamarlo giusto quando chiamo SaveCompany (all'interno di questo metodo) e quindi non dovrei preoccuparmi della mia interfaccia utente web o del mio cellulare poiché il suo% in% co_de lo chiamerebbe automaticamente. Ma poi questo sembra sbagliato poiché lega la mia classe manager (la mia API) a un'implementazione di posta elettronica fisica.

Qualcuno può darmi qualche suggerimento o come ottenerlo, magari dando un'occhiata al loro design o processo di pensiero.

Come detto questo è ASP.NET Web Forms, C #, un sacco di jQuery e SQL Server 2008.

    
posta JonH 18.09.2014 - 04:25
fonte

2 risposte

8

Fondamentalmente, hai due problemi qui:

  • Le e-mail vengono inviate dal livello di presentazione,
  • L'API è legata all'implementazione fisica della posta elettronica.

Il primo problema è risolto dalla prima fase di spostamento del codice a cui appartiene: nel livello aziendale. Non dovresti salvare le aziende dal livello di presentazione e non dovresti inviare e-mail da lì: sposta tutto il codice a cui appartiene e focalizza il livello di presentazione sulla presentazione, cioè generazione di codice HTML o JSON o XML da un modello .

Livello aziendale:

public class Example
{
    public void ProcessSamplePage(...)
    {
        CustomerManagement.Create(...);
        SmtpService.NotifyCustomerRegistered(...);
        var model = ...
        Presentation.GenerateHtml(model);
    }
}

Il passaggio da ASP.NET a ASP.NET MVC può aiutare a evitare tali errori in futuro.

Il passo successivo è Dependency Injection, che risolve anche il secondo problema. Invece di utilizzare una classe specifica fornita da .NET Framework per inviare e-mail direttamente dal tuo livello aziendale, puoi creare un'interfaccia che avrà un metodo specifico per inviare messaggi e quindi utilizzare qualsiasi implementazione tu volere. Il messaggio di spedizione può significare l'invio di una vera e-mail tramite .NET Framework, l'invio di un'e-mail attraverso una libreria di terze parti, l'invio di una e-mail mediante la connessione manuale al server SMTP, la memorizzazione di un file di testo in una directory in cui il servizio SMTP lo selezionerà o ... memorizzerà il messaggio nel database.

Livello aziendale:

public class Example
{
    public Example(IMessagesDispatcher dispatcher) { ... }

    public void ProcessSamplePage(...)
    {
        CustomerManagement.Create(...);
        this.dispatcher.NotifyCustomerRegistered(...);
        var model = ...
        Presentation.GenerateHtml(model);
    }
}

Ora che è possibile archiviare i messaggi nel database invece di inviarli semplicemente tramite e-mail, è possibile immaginare scenari più complessi, come un servizio Windows che verifica regolarmente il database e invia e-mail in sospeso. Ciò consente anche di controllare il carico del server SMTP: se si devono inviare centinaia di e-mail al secondo tra le 14:00 e le 15:00, ma solo poche decine di e-mail al minuto durante la notte, è possibile riprogrammare la priorità bassa e -Mail per essere effettivamente spedito durante la notte.

    
risposta data 25.09.2014 - 18:14
fonte
2

A seconda della configurazione, l'e-mail può a volte richiedere una quantità irragionevole di tempo per rispondere, e può fallire in modo ambiguo e richiedere ulteriori tentativi. Quindi suggerirei che questa è una delle volte in cui un servizio è in ordine. O sotto forma di un tuo servizio o di un server SMTP su cui hai il controllo.

Il server SMTP locale presenta un'interfaccia più nota, che media gli altri problemi, ma generalmente preferisco la situazione in cui lo stato del database è ciò che causa l'invio di messaggi in modo asincrono.

La soluzione migliore che ho visto è che l'e-mail sia integrata in un servizio di flusso di lavoro che tenga traccia di chi ha fatto cosa e chi abilita a fare ciò che segue. Quindi puoi inviare e-mail con link efficaci al loro interno, ma sapere quando quei collegamenti non sono più applicabili.

    
risposta data 25.09.2014 - 19:13
fonte

Leggi altre domande sui tag