从另一个DAOFactory调用一个DAO

MrH*_*rio 5 java architecture oop design-patterns

目前,我的应用程序架构流程如下:

查看→演示者→一些异步执行器→DAOFactory→DAO(接口)→DAO(Impl)

目前,这种架构有效; 主要是因为我此刻只需要一种DAO.但随着需求的增长,我需要扩展到多个DAO,每个DAO都有自己的实现如何获取数据.

这是我的案例说明:

在此输入图像描述

主要的问题来自于FooCloudDao从API加载数据.此API需要某种身份验证方法 - 在登录期间存储的字符串标记(例如,Session对象 - 是的,它也有自己的DAO).

只是在没有连接的情况下传递一个Session实例是很诱人FooDaoFactory的,但它似乎是hackish和反直觉.我可以想象的下一件事是SessionDAOFactory从内部访问FooDaoFactory以获取a的实例Session(然后在我需要FooCloudDAO实例时传递它).

但正如我所说,我不确定我是否可以做这样的事情 - 好吧,也许我可以,但这是否真的是这样做的正确方法?

Den*_*dic 1

我认为您的问题实际上是FooCloudDao与其他组件具有不同的“依赖关系”,并且您希望避免在途中通过每个类传递依赖关系。

尽管有很多设计模式可以解决您的问题,但我建议您了解一下依赖注入/控制反转原则和框架。你会用这个做的是:

  1. 您可以根据需要创建一个界面FooCloudDao,例如:
interface ApiTokenProvider {
     string GetToken();
 }
Run Code Online (Sandbox Code Playgroud)
  1. 您将创建并实现该接口,该接口将从会话或该事物来自的任何地方获取它:
class SessionBasedApiTokenPrivider implements ApiTokenProvider {
    public string GetToken() {
        // get it from the session here
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 上面定义的类需要在您选择的IoC 容器中注册ApiTokenProvider为 接口的实现(这样,无论谁提出请求,ApiTokenProvider都将与实际实现解耦 -> 容器将为他提供正确的实现)。

  2. 您将在您的类上有一个称为构造函数注入FooCloudDao的东西(容器稍后使用它来“注入”您的依赖项):

public FooCloudDao(ApiTokenProvider tokenProvider) {
    // store the provider so that the class can use it later where needed
}
Run Code Online (Sandbox Code Playgroud)
  1. 您的 FooDaoFactory 将使用IoC 容器来解析 及其FooCloudDao所有依赖项(因此您不会实例化FooCloudDaowith new)

执行这些步骤时,您将确保:

  • FooDaoFactory保持干净的依赖传递
  • 你使你的代码更加可测试,因为你可以FooCloudDao 在没有真实会话的情况下测试你的代码(你只能给出假接口实现)
  • 以及控制反转带来的所有其他好处......

关于会话的注意事项:如果遇到在 中获取会话的问题SessionBasedApiTokenProvider,大多数时候会话本身也注册到 IoC 控制器,并在需要的地方注入。