Я использую Spring для этого проекта, но у меня была такая же проблема с Guice.Передача состояния контейнерам, управляемым CDI
В принципе, у меня есть функциональность, для которой необходимы как помощники без состояния, так и данные состояния.
public class AwesomeDoer {
@Inject
private Helper helper; //stateless
...
public void doAwesome(int state) {
helper.help(state)
}
}
Это выглядит довольно хорошо, пока doAwesome
не имеет 5 параметров и вызываются 1000 раз, но 3 из аргументов имеют одинаковое значение каждый раз, в то время как четвертый аргумент может измениться лишь несколько раз. Изменение подходящих параметров в полях является очевидным решением. Тем не менее, это требует от вас жертвовать либо управлением CDI этого класса, либо вы должны иметь инициализатор или сеттеры, чтобы заполнить состояние после того, как весна делает свое дело.
Я обычно удосужился, создав завод, управляемый Spring, т.е.
public class AwesomeFactory {
@Inject
private Helper helper;
public AwesomeDoer getAwesomeDoer(int state) {
return new AwesomeDoer(helper, state);
}
}
Но опять же, это не означает, что мой AwesomeDoer больше не управляется Spring, и это требует от меня, чтобы написать еще еще один уровень не-бизнес-логики. Также легко представить себе такой подход, который приведет к созданию AwesomeFactoryFactory и т. Д., Что всегда заставляет меня немного умереть внутри.
У кого-нибудь есть более чистый способ сделать это?
Всякий раз, когда возникает слишком много параметров, вводите контекст или объект передачи, например 'StateDTO' или' StateContext', который обертывает параметры. Это было бы лучше, чем «обходной путь» с aop. – membersound