从另一个DAOFactory调用一个DAO

时间:2015-06-28 16:22:09

标签: java oop design-patterns architecture

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

  

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

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

以下是我案例的说明:

enter image description here

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

Session实例传递给FooDaoFactory是很诱人的,以防万一没有连接,但它似乎是hackish和反直觉。我可以想象的下一件事是从SessionDAOFactory内访问FooDaoFactory以获得Session的实例(然后在需要FooCloudDAO实例时传递它)。

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

1 个答案:

答案 0 :(得分:1)

我认为你的问题实际上是FooCloudDao有不同的依赖关系"比其他组件,你想避免在途中通过每个类传递依赖。

尽管有一些设计模式可以解决你的问题,我建议你看看 依赖注入/控制反转 原则和框架。你要做的是:

  
      
  1. 您可以为FooCloudDao需要的内容创建界面,例如:
  2.   
interface ApiTokenProvider {
     string GetToken();
 }
  
      
  1. 您将创建该接口的实现,该接口将从会话或其中的任何位置获取:
  2.   
class SessionBasedApiTokenPrivider implements ApiTokenProvider {
    public string GetToken() {
        // get it from the session here
    }
}
  
      
  1. 上面定义的类需要在您选择的IoC容器中注册为ApiTokenProvider的实现   接口(以便任何要求ApiTokenProvider的人将被解耦   从实际实施 - >容器会给他   正确实施)。

  2.   
  3. 你的FooCloudDao 类会有一些叫做构造函数注入的东西(容器稍后会用到"注入"   你的依赖):

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

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

  • FooDaoFactory仍然没有通过
  • 传递家属
  • 您使代码更易于测试,因为您可以在没有真实会话的情况下测试FooCloudDao(您只能在假接口实现中提供)
  • 以及控制反转所带来的所有其他好处......

会话注意事项:如果遇到SessionBasedApiTokenProvider中的会话问题,大多数情况下会话本身也会在IoC控制器中注册,并在需要时注入。