代码之家  ›  专栏  ›  技术社区  ›  parkr

处理运行时依赖项

  •  0
  • parkr  · 技术社区  · 15 年前

    依赖项注入是一种有用的技术,但是当面对运行时依赖项时,建议采用什么方法?

    e、 例如,根据事件类型和发起请求的用户,您希望将事件粘附到事件处理器。

    public interface Event {}
    
    public interface EventProcessor {
        public void handleEvent(Event e);
    }
    
    class EventProcessorFactory {
        private final User u;
        private final Event e;
    
        public EventProcessorFactory(User u, Event e) {
            this.u = u;
            this.e = e;
        }
    
        public EventProcessor get() {
            EventProcessor ep;
            if(e instanceof LocalEvent) {
                ep = new LocalEventProcessor();
            }
            else if(e instanceof RemoteTriggeredEvent && u instanceof AdminUser) { 
                //has static dependencies
                ep = new RemoteEventProcessor(u);
            }
            else {
                ep = new DefaultEventProcessor();
            }
        }
    }
    

    现在,复杂性被封装在工厂中,但是如果没有太多的样板代码,我怎么能实现同样的结果呢?

    3 回复  |  直到 15 年前
        1
  •  3
  •   soru    15 年前

    正如我所写的,你所谓的“样板代码”在我看来只是“代码”。您需要在某个地方声明一些处理逻辑(本地事件转到本地事件处理器,等等)。试图避免明确说明逻辑可能是错误的。

    如果您确实希望这样做,最简单的方法是更改接口以添加方法:

    boolean isInterestedInEvent(Event e)
    

    然后设置所有事件处理器,并在其上循环,直到找到正确的事件处理器。

        2
  •  2
  •   ptomli    15 年前

    你可以用像这样的东西

    public interface EventProcessor {
        public boolean supports(Event event, User user);
        public void handleEvent(Event event);
    }
    
    class EventProcessorFactory {
        public void setEventProcessors(List<EventProcessor> processors) {
            this.processors = processors;
        }
        public EventProcessor get(Event event, User user) {
            for (EventProcessor processor : processors) {
                if (processor.supports(event, user)
                    return processor;
            }
        }
    }
    
    class LocalEventProcessor implements EventProcessor {
       public boolean supports(Event event, User user) {
            return (event instanceof LocalEvent);
       }
       // etc
    }
    
    class RemoteEventProcessor implements EventProcessor {
        public boolean supports(Event event, User user) {
            return (event instanceof RemoteTriggeredEvent) &&
                   (user instanceof AdminUser);
        }
        // etc
    }
    

    Comparable 为了确保它们以正确的顺序进行测试,否则您可以依赖于它们以所需的顺序注入工厂,从而使其可配置。

        3
  •  0
  •   Adamski    15 年前

    Event 负责创建 EventProcessor . 这样可以减少 instanceof

    public interface Event {
      EventProcessor createProcessor(User u);
    }
    
    public class RemoteTriggeredEvent implements Event {
      public EventProcessor createProcessor(User u) {
        return (u instanceof AdminUser) ? new RemoteEventProcessor(u) :
          new DefaultEventProcessor();
      }
    }