2015-02-23 71 views
0

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

我有一个想法是使用Spring并使用applicationContext.getBean(“beanName”+ user.getkey())。这将允许在业务逻辑中可能出现差异的地方动态加载bean。这里唯一不好的地方是主代码和Spring相关,我真的认为这不是什么大问题。

我的问题是这可以用Drools,Mule等来实现吗?我不清楚任何框架,但可以使用一些建议,在哪条大街上进行。

谢谢。

回答

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. 的Autowire接口的所有实现成任何bean需要使用它们的接口实现的接口。
  4. 需要时,根据用户的类型选择实现。

我也不知道框架非常好,但可以在 使用一些建议采取哪一种途径。

首先隐藏接口背后的逻辑并将用户特定的东西封装到不同的类中。一旦所有东西都依赖于接口,如果以后需要将用户特定的东西移动到规则引擎,那么在不破坏应用程序的其余部分的情况下,应该很容易。

代码示例:

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

}