La mia domanda riguarda l'utilizzo della delega insieme all'iniezione di ereditarietà e dipendenza.
Ho una classe MailerService
che richiede un delegato per fare il suo lavoro.
Inoltre, ho una gerarchia di delegati con un'astrazione: MailerServiceDelegate
insieme a un numero di implementazioni, tra cui un EmailResetDelegate
.
Ecco la classe Spring che utilizza il delegato:
@Service
public class MailerService {
private static final boolean IS_HTML = true;
private static final boolean MULTIPART = true;
private static final String ENCODING = "UTF-8";
...
private final JavaMailSender mailSender;
private MailerServiceDelegate mailerServiceDelegate;
public MailerService(...
JavaMailSender mailSender,
...) {
this.mailSender = mailSender;
}
public void setMailerServiceDelegate(MailerServiceDelegate mailerServiceDelegate) {
this.mailerServiceDelegate = mailerServiceDelegate;
}
public void sendMail(Object ...objects) {
try {
final Context ctx = new Context();
...
mailerServiceDelegate.setContext(ctx, objects);
final MimeMessage mimeMessage = mailSender.createMimeMessage();
...
mailSender.send(mimeMessage);
} catch (MessagingException | UnsupportedEncodingException e) {
throw new MailerException(e);
}
}
}
Ecco l'implementazione per il delegato:
//As of now this is a plain class and not a spring dependency
public class EmailResetDelegate implements MailerServiceDelegate {
E il cliente:
@Service
public class Client {
private MailerService mailerService;
public Client(MailerService mailerService) {
this.mailerService = mailerService;
}
public void sendEmailAddressResetRequest(UserAccount userAccount, EmailReset emailReset) {
mailerService.setMailerServiceDelegate(new EmailResetDelegate());
mailerService.sendMail(userAccount, emailReset);
}
}
Il problema con il design attuale è che devo impostare manualmente il delegato usando il metodo setMailerServiceDelegate
dal client. Inoltre sto mescolando l'iniezione di dipendenza con l'istanziazione manuale. Qualcuno può suggerire un design migliore?
Modifica : questo è il diagramma per il progetto corrente: