代码之家  ›  专栏  ›  技术社区  ›  Amir Ziarati

一个简单的ioc容器类有什么问题?

  •  0
  • Amir Ziarati  · 技术社区  · 6 年前

    上一天我在我的一个操场项目中实现了一个简单的类作为ioc容器(不是很像那样),一些专业人士告诉我,在测试代码时会遇到一些问题(太多了,无法分享到底是什么问题!)!)

    虽然我自己总是使用ioc框架,但我想知道为什么这种方法是不好的?

    我甚至用这种方法编写了很多测试(使用模拟框架),从来没有遇到过问题。

    我想要你对这个设计问题的看法:

    public class IocContainer{
    
      private static IocContainer instance;
    
      private IocContainer(){
      }
    
      public static IocContainer getInstance()
      {
        if(instance == null){
          instance = new IocContainer();
        }
        return instance;
      }
    
      public ChatPresenter getChatPresenter(ChatView chatView)
      {
        return new ChatPresenterImpl(chatView, getChatRepo() , getMessagingService());
      }
    
      private ChatRepo getChatRepo()
      {
        return new ChatRepoImpl(getDbHelper(), getRemoteService());
      }
    
      private MessagingService getMessagingService()
      {
        return new MessagingServiceImpl()
      }
    
      private DbHelper getDbHelper()
      {
        return new DbHelperImpl();
      }
    
      private RemoteService getRemoteService()
      {
        return new RemoteServiceImpl();
      }
    }
    

    如你所见,我只让GetChatPresenter可访问,我在下面的视图中使用它,它工作得很好。

    ChatPresenter presenter = IocContainer.getInstance().getChatPresenter(this)
    

    这段代码处理控制反转,没有任何紧密耦合(使用接口)。

    我想知道这种方法有什么不对吗?(我想从技术角度得到答案,因为我已经知道使用ioc容器库更容易,它有更多的特性,比如作用域等等…)

    实际上,我想知道这种方法在未来会有什么问题和限制吗?

    残忍地杀了我:D

    1 回复  |  直到 6 年前
        1
  •  1
  •   Thomas    6 年前

    总结评论线索:

    您的方法看起来像martin fowler在这里描述的服务定位器: http://martinfowler.com/articles/injection.html#InversionOfControl

    martin所描述的和您的代码有一个主要的区别:您的代码直接创建服务的实例,因此更像是一个工厂而不是一个注册表。

    控制反转的基本思想/目标是通过减少依赖性来减少耦合,如果容器依赖于服务实现(它需要直接调用构造函数),则不会发生这种情况。所以你问题中的实现有点反对这个基本思想。

    依赖于实现的缺点之一是,不必重新编译容器,就无法替换服务。如果您很可能永远不会有不同的实现,那么这可能不是问题,但是如果您可能需要它,一个服务 登记处 会更有用。

    注册中心通常提供注册服务实现并根据请求交付服务实现的方法。这取决于您的需求,但它可能与发现的第一个实现一样简单,也可能更复杂,例如通过匹配一些参数(了解一些关于cdi注入点参数和替代方案的想法)。

    注册表通常附带一些配置注册表的方法,例如通过配置文件或类路径扫描(自动查找存在的插件)。不过,编写一些配置注册表的代码也可能足够了。这完全取决于你需要摆脱什么样的耦合(以解决你面临的问题),以及什么样的耦合是可以接受的。

    推荐文章