解耦项目引用和依赖注入

时间:2016-03-09 18:31:04

标签: java oop design-patterns dependency-injection

所以我有以下挑战。

我有gradle项目结构。

  • 主要项目

    - a。 Android(#Sub-Project 1)
    - b。下议院(#子项目2)
    - C。 Http-Comms(#Sub-Project 3)

摘要 我有上面的3个项目。 HTTP-Comms必须是独立的,它依赖于Commons项目。 HTTP-Comms有一个接口和实现器,它公开了启动和停止服务器的方法。问题是我在HTTP-Comms中引用了Android项目,并希望将其解耦。因此,正常版本可以运行此功能,开发人员构建将运行 此功能。如果我不将此项目包含在正常构建的分发中,Android将因ClassNotFound而失败..

简要解释 现在这个HTTP-Comms project有一个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 project,其中包含启动和停止服务器的操作按钮。所以这取决于HTTP-Comms项目。我正在这里做

IhttpComms comms = new Controller();

因此在HTTP-Comms和Android项目之间建立紧密耦合。

可以引用Commons project的位置,并且应该在这些项目之间具有公共代码。 But Commons project cannot hold reference to HTTP-COMMS

现在,由于HTTP-Comms对我们来说是一个孵化功能,我们要求它在某些时候不要成为构建过程的一部分。

我的问题是......

  1. 我可以使用任何依赖注入framewroks,我将能够 将依赖对象注入项目之外。 ??就像有一个Controller实例并注入Android?

  2. 没有DI框架..任何其他设计模式解决方案?

1 个答案:

答案 0 :(得分:0)

问题在于IhttpComms及其实现都在同一个项目/ jar中。我会将IhttpComms移动到它自己的项目中,并让Android项目引用这个新项目,该项目应该只有Interfaces和Abstract类。这样你就可以将你的Android项目与Http-Comms中的具体类分开。然后你可以自由地使用你喜欢的任何IhttpComms实现,并在运行时使用(你猜对了)一个DI框架甚至简单的Class.forName

加载它。

总结:

  1. IHttp-Comms:新项目只接口,没有依赖
  2. Android(#Sub-Project 1)依赖于IHttp-Comms
  3. Commons(#Sub-Project 2)
  4. Http-Comms(#Sub-Project 3),IHttp-Comms实现(具体类)依赖于IHttp-Comms和Commons