3 votes

Modification d'un paramètre - qui est responsable ?

J'ai un tableau qui est rempli par une autre application. Cette table contient un attribut appelé IsMailSent .

EF construit mes objets de type Request en fonction des données de la base de données.

L'objet ressemble à quelque chose comme ceci :

public class Request {
    int SomeInt;
    bool IsMailSent;
    SomeObject SomeObject;
}

Maintenant je veux créer un Service qui chargera toutes les entrées avec IsMailSent == false et envoyer ce courrier à leurs destinataires.

Mon code actuel fonctionne comme suit : Une classe appelée MailMessageService a obtenu une Start() et un Stop() méthode. Le site Start ressemble à ceci :

public void Start(int delay) {
        tokenSource = new CancellationTokenSource();
        T = new Task(() => {
            MailService ms = new MailService(Res.ServerAddress, int.Parse(Res.ServerPort));
            while (true) {
                var messages = GetMailMessages(_context.Requests.Where(o => !o.IsMailSent));
                ms.Send(messages);
                Thread.Sleep(delay);
            }
        }, tokenSource.Token);
    }

La méthode GetMailMessages reçoit une collection de Request et construit une collection de MailMessages . Actuellement, j'ai créé une classe qui hérite de MailMessage et contient une référence à l'objet de demande correspondant. L'idée sous-jacente est que l'objet MailService (qui est responsable de l'envoi des courriers) doit définir l'option IsMailSent à la propriété true .

Ainsi, le Send() La méthode doit définir IsMailSent = true

Mais est-ce la meilleure façon de procéder ? Si je comprends bien les principes de SOLID, la MailService ne devrait pas être responsable de la définition de cette propriété (puisqu'il est responsable de l'envoi des courriers) - ou ai-je tort ?

2voto

Kevin Wallis Points 3038

Vous pourriez ajouter une méthode permettant de définir le IsMailSent à la Request classe. Ainsi, le Request déciderait finalement d'activer ou non l'attribut IsMailSent a true . De cette façon, le code défini est toujours dans le Request et il serait toujours possible d'influencer l'ensemble.

Par exemple

public class Request {
    // Property
    public bool IsMailSent { get; private set; }

    public void MailSent() {
       // TODO check some conditions
       if (...) {
           ...
       }

       // If everything is correct set the property
       IsMailSent = true;
    }
}

Et dans le MailService.Send(...) vous appelez MailSent méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X