每个用户实施不同的业务规则

时间:2015-02-23 04:06:37

标签: spring rules

我正在维护在Java中使用if ... else语句的软件,以便为每个用户实现不同的业务规则。我知道这不是实现这种要求的最佳方式。

我的一个想法是使用Spring并使用applicationContext.getBean(" beanName" + user.getkey())。这将允许在业务逻辑中可能出现差异的点动态加载bean。唯一不好的是,主要代码与Spring有关,我真的不认为这是一个很大的交易。

我的问题是可以用Drools,Mule等实现吗?我不太了解这两个框架,但可以使用一些建议去寻找哪条途径。

感谢。

1 个答案:

答案 0 :(得分:0)

  

我的问题是可以用Drools,Mule等实现吗?

这是一个非常开放的问题,可能比SO更适合程序员。查看very good answers to this similar question

  

我的一个想法是使用Spring并使用   applicationContext.getBean(“beanName”+ user.getkey())。这个会   允许在差异可能的点动态加载bean   发生在业务逻辑中。这里唯一不好的是主要的   代码与Spring有关,我真的不认为这是一个很大的问题   交易。

你可以使逻辑可插拔,而不必将自己与Spring联系起来。使用applicationContext.getBean()会破坏依赖注入的目的,所以我不建议这样做。尝试这样的事情:

  1. 定义封装用户特定逻辑的接口
  2. 为每种类型的用户创建界面实现
  3. 将接口的所有实现自动装配到任何需要使用它们的bean中。
  4. 根据需要,根据用户的类型选择实现。
  5.   

    我不太了解这两种框架,但可以使用一些建议   追求的途径。

    首先将逻辑隐藏在接口后面,并将用户特定的东西封装到单独的类中。一旦所有内容都取决于界面,如果您以后需要将用户特定的内容移动到规则引擎,那么应该很容易实现,而不会破坏应用程序的其余部分。

    代码示例:

    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);
            }
        }
    
    }