Какова лучшая структура кода для внедрения зависимостей в моей ситуации? - PullRequest
0 голосов
/ 13 марта 2019

Эти коды являются частью mq customer для получения сообщения о задаче отправки почты, поэтому карта полезной нагрузки записи содержит информацию об электронном письме, такую ​​как адрес прибытия, информация о пользователе. это формат JSON, как:

{
    "to": "aaa@bbb.com",
    "userId": "12",
    ...
}

У меня есть слушатель для прослушивания mq, например:

@Component
public class RecDownloadListener {

    private final JavaMailSender javaMailSender;

    @Autowired
    RecDownloadListener(JavaMailSender javaMailSender){
        this.javaMailSender = javaMailSender;
    }

    @Autowired
    @RabbitListener(queues = TASK)
    private void listener(RecDownloadContentBuilder builder,
                          Channel channel,
                          @Payload Map<String, String> searchParams,
                          @Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag) {

        //I want the builder could be auto injected like @Payload or @Hearder
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        String content = builder.getContent();
        String title = builder.getEmailTitle();
        String address = builder.getArriveAddress();

        //use above info to update mimeMessage and send it.
        javaMailSender.send(mimeMessage);
    }
}

последние три аргумента будут заполнены автоматически, все они получены от rabbitmq, я хочу автоматически передать первый builder, как я написал, а builder как:

@Component
@Scope(SCOPE_PROTOTYPE)
class TaskContentBuilder {

    private final Map<String, String> searchParams;
    private final UserDao userDao;
    private TemplateEngine templateEngine; //thymeleaf

    @Autowired
    RecDownloadContentBuilder(Map<String, String> searchParams, CpAccountDao cpAccountDao, TemplateEngine templateEngine) {
        this.searchParams = searchParams;
        this.cpAccountDao = cpAccountDao;
        this.templateEngine = templateEngine;
    }

    public String getEmailContent(){
        User user = userDao.findById(searchParams.get("userId"));
        Context context = new Context;
        // context.update(user.someInfomation())
        return templateEngine.process(template, context);
    }

    public String getEmailTitle(){...}
    public String getArriveAddress(){...}

}

одно из полей builder dao легко ввести, слушатель получит сообщение одно за другим очень быстро, построитель только для одной записи сообщения. я должен сделать (Map)searchParams как возврат функции бина? Или это нормально, просто внедрить только dao при создании экземпляра компоновщика и установить в searchParams?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...