Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解耦项目引用和依赖项注入_Java_Oop_Design Patterns_Dependency Injection - Fatal编程技术网

Java 解耦项目引用和依赖项注入

Java 解耦项目引用和依赖项注入,java,oop,design-patterns,dependency-injection,Java,Oop,Design Patterns,Dependency Injection,所以我的挑战如下 我有gradle项目结构 主要项目 --a。Android(#子项目1) --b。公共设施(子项目2) --c。Http通信(子项目3) 摘要 我有3个以上的项目HTTP通信必须是独立的,它依赖于Commons项目。HTTP Comms有一个接口和实现程序,它公开了启动和停止服务器的方法。问题是我在Android中有一个httpcomms项目的参考,我想将其解耦。因此,正常构建可以在不使用此功能的情况下运行,而开发人员构建将在使用此功能的情况下运行。如果我不将这个项目包含在

所以我的挑战如下

我有gradle项目结构

  • 主要项目

    --a。Android(#子项目1)
    --b。公共设施(子项目2)
    --c。Http通信(子项目3)

摘要 我有3个以上的项目
HTTP通信必须是独立的,它依赖于
Commons
项目。HTTP Comms有一个接口和实现程序,它公开了启动和停止服务器的方法。问题是我在
Android
中有一个
httpcomms
项目的参考,我想将其解耦。因此,正常构建可以在不使用此功能的情况下运行,而开发人员构建将在使用此功能的情况下运行。如果我不将这个项目包含在正常构建的发行版中,Android将因为ClassNotFound而失败

简要说明 现在,这个
httpcomms项目有一个NanoHttpdServer实现,并有许多类,这些类引用了与服务器和其他实用程序类相关的库。它是独立的。我们有一个接口IHttpComms,它有启动和停止服务器的方法

interface IHttpComms{
  public void startServer();
  public void stopServer();
  public void serveRequest();
}

class Controller implements IhttpComms{

 //Implements the feature
 // reference to other classes in the HTTP-Comms project.

}
现在有另一个
Android项目
,它有启动和停止服务器的操作按钮。所以它取决于
httpcomms
project。我在这里做什么

IhttpComms comms = new Controller();
因此,在HTTP通信和Android项目之间实现了紧密耦合

其中as
Commons项目
可以引用,并且这些项目之间应该有公共代码
但Commons项目无法保留对HTTP-COMMS的引用

现在,由于HTTP通信对我们来说是一个酝酿中的特性,我们要求它在某些时候不成为构建过程的一部分

我的问题是

  • 我可以使用任何依赖项注入框架吗?我仍然能够在项目外部注入依赖项对象。??比如有一个Controller实例并注入到Android

  • 没有DI框架。。还有其他设计模式解决方案吗


  • 问题是IHTTPComm及其实现都在同一个项目/jar中。我会将IhttpComms移动到它自己的项目中,并让Android项目引用这个新项目,它应该只有接口和抽象类。通过这种方式,您可以将Android项目与Http通信中的具体类解耦。然后,您可以自由地使用您喜欢的IHTTPComm的任何实现,并在运行时使用(您猜得到的)DI框架甚至谦逊的Class.forName加载它

    总结如下:

  • IHttp通信:仅新项目接口,无依赖项
  • Android(#子项目1)对IHttp通信的依赖性
  • 公共设施(子项目2)
  • Http通信(#子项目3),IHttp通信实现(具体类),依赖于IHttp通信和Commons

  • 这个安卓项目是驱动程序项目吗?我的意思是,它是独自运行还是主项目是驱动程序项目,它使用android one?@Erkan主项目有等级脚本,可以按要求的顺序运行任务。。android和http comms项目中都使用了common项目