我正在维护在Java中使用if ... else语句的软件,以便为每个用户实现不同的业务规则。我知道这不是实现这种要求的最佳方式。
我的一个想法是使用Spring并使用applicationContext.getBean(" beanName" + user.getkey())。这将允许在业务逻辑中可能出现差异的点动态加载bean。唯一不好的是,主要代码与Spring有关,我真的不认为这是一个很大的交易。
我的问题是可以用Drools,Mule等实现吗?我不太了解这两个框架,但可以使用一些建议去寻找哪条途径。
感谢。
答案 0 :(得分:0)
我的问题是可以用Drools,Mule等实现吗?
这是一个非常开放的问题,可能比SO更适合程序员。查看very good answers to this similar question。
我的一个想法是使用Spring并使用 applicationContext.getBean(“beanName”+ user.getkey())。这个会 允许在差异可能的点动态加载bean 发生在业务逻辑中。这里唯一不好的是主要的 代码与Spring有关,我真的不认为这是一个很大的问题 交易。
你可以使逻辑可插拔,而不必将自己与Spring联系起来。使用applicationContext.getBean()
会破坏依赖注入的目的,所以我不建议这样做。尝试这样的事情:
我不太了解这两种框架,但可以使用一些建议 追求的途径。
首先将逻辑隐藏在接口后面,并将用户特定的东西封装到单独的类中。一旦所有内容都取决于界面,如果您以后需要将用户特定的内容移动到规则引擎,那么应该很容易实现,而不会破坏应用程序的其余部分。
代码示例:
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);
}
}
}