spring 使用java 8和服务注入的策略模式

1cklez4t  于 2023-11-16  发布在  Spring
关注(0)|答案(2)|浏览(150)

我正在尝试为一些自定义验证实现策略模式,这些自定义验证不仅涉及带有基本操作的验证输入,而且我确实需要调用一些其他服务来验证数据。
在开始的时候,我使用了提到的here的例子,它使用了枚举来拥有不同的策略,但是当然不可能将我的服务注入到枚举中,所以现在我来看看利用java 8的this,以获得更清晰的理解。
我的想法是有一个接口,有一个方法validate(),并为不同的对象提供通用输入,我可以发送它,然后一个类实现该接口,该接口将根据对象类型进行不同的验证,并将请求分派到不同的服务,但另一方面,我有点失去了枚举的优势,因为我可以根据特定的用户设置选择不同的策略。
你知道如何同时拥有这两种优势吗?

raogr8fs

raogr8fs1#

我认为枚举和策略模式并没有真正混合在一起。
枚举的理想用例是代表一组详尽的选择。例如,DayOfWeek代表星期一到星期日。使用这种方法的问题是,除了不能自动连接任何其他bean之外,您的枚举将随着验证数量的增加而继续增长。
strategy模式允许你使用无限多的可能策略,只要它遵守契约。以Collections.sort(List<T> list, Comparator<? super T> c)为例,可能没有详尽的比较器列表,因为它永远无法满足每个人的用例。
将你的每一个可能的策略定义为一个组件会更有意义

@Component 
class NonNullValidationStrategy implements ValidationStrategy {
    private final MyService service;

    //constructor

    @Override
    public boolean isValid(MyClass foo) {
        return foo != null;
    }
}

字符串
当你需要的时候,你如何获得正确策略的示例将取决于你没有提供的细节。也许带限定符的自动装配是一种可能。
Spring已经有了它的own way of defining validations, via interfaces and annotations。我建议你在推出自己的解决方案之前先研究一下。

pftdvrlh

pftdvrlh2#

它建议使用javax。验证组,查看更多关于它的信息here,特别是@Validated(OnCreate.class)
如果你想在控制器级别应用策略模式,请参阅this article,特别是my comment,因为这里描述的不是一个很干净的解决方案。

相关问题