为每个用户实施不同的业务规则
问题描述:
我正在维护在Java中使用if ... else语句的软件,以便为每个用户实施不同的业务规则。我知道这不是实施这种要求的最佳方式。为每个用户实施不同的业务规则
我有一个想法是使用Spring并使用applicationContext.getBean(“beanName”+ user.getkey())。这将允许在业务逻辑中可能出现差异的地方动态加载bean。这里唯一不好的地方是主代码和Spring相关,我真的认为这不是什么大问题。
我的问题是这可以用Drools,Mule等来实现吗?我不清楚任何框架,但可以使用一些建议,在哪条大街上进行。
谢谢。
答
我的问题是可以用Drools,Mule等来实现吗?
这是一个相当开放的问题,可能比SO更适合程序员。看看very good answers to this similar question。
我的一个想法是使用Spring并使用 applicationContext.getBean(“beanName”+ user.getkey())。这将使 允许在业务逻辑中可能出现差异 的位置动态加载bean。这里唯一不好的地方是主要的 代码与Spring相关,我真的不认为这是一个很大的 交易。
您可以使逻辑可插入,而无需自己绑定到Spring。使用applicationContext.getBean()
失败了依赖注入的目的,所以我不建议这样做。尝试是这样的:
- 定义封装了用户特定的逻辑
- 创建为每种类型的用户
- 的Autowire接口的所有实现成任何bean需要使用它们的接口实现的接口。
- 需要时,根据用户的类型选择实现。
我也不知道框架非常好,但可以在 使用一些建议采取哪一种途径。
首先隐藏接口背后的逻辑并将用户特定的东西封装到不同的类中。一旦所有东西都依赖于接口,如果以后需要将用户特定的东西移动到规则引擎,那么在不破坏应用程序的其余部分的情况下,应该很容易。
代码示例:
public enum UserType {
FOO, BAR
}
public interface UserStrategy {
public void doStuff();
public UserType getUserType();
}
@Component
public class FooUserStrategy implements UserStrategy {
public void doStuff() {
// foo specific stuff
}
public UserType getUserType() {
return UserType.FOO;
}
}
@Component
public BarUserStrategy implements UserStrategy {
public void doStuff() {
// bar specific stuff
}
public UserType getUserType() {
return UserType.BAR;
}
}
@Service
public class ClassThatUsesStrategies {
private Map<UserType, UserStrategy> map = new HashMap<>();
public void doUserTypeSpecificStuffForUser(User user) {
UserStrategy s = map.get(user.getUserType);
s.doStuff();
}
@Autowired
public void setUserStrategies(List<UserStrategy> strategies) {
for (UserStrategy current : strategies) {
map.put(current.getUserType(), current);
}
}
}