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实例时传递它).
但正如我所说,我不确定我是否可以做这样的事情 - 好吧,也许我可以,但这是否真的是这样做的正确方法?
我认为您的问题实际上是FooCloudDao与其他组件具有不同的“依赖关系”,并且您希望避免在途中通过每个类传递依赖关系。
尽管有很多设计模式可以解决您的问题,但我建议您了解一下依赖注入/控制反转原则和框架。你会用这个做的是:
- 您可以根据需要创建一个界面
FooCloudDao,例如:
interface ApiTokenProvider {
string GetToken();
}
Run Code Online (Sandbox Code Playgroud)
- 您将创建并实现该接口,该接口将从会话或该事物来自的任何地方获取它:
class SessionBasedApiTokenPrivider implements ApiTokenProvider {
public string GetToken() {
// get it from the session here
}
}
Run Code Online (Sandbox Code Playgroud)
上面定义的类需要在您选择的IoC 容器中注册
ApiTokenProvider为 接口的实现(这样,无论谁提出请求,ApiTokenProvider都将与实际实现解耦 -> 容器将为他提供正确的实现)。您将在您的类上有一个称为构造函数注入
FooCloudDao的东西(容器稍后使用它来“注入”您的依赖项):
public FooCloudDao(ApiTokenProvider tokenProvider) {
// store the provider so that the class can use it later where needed
}
Run Code Online (Sandbox Code Playgroud)
- 您的 FooDaoFactory 将使用IoC 容器来解析 及其
FooCloudDao所有依赖项(因此您不会实例化FooCloudDaowithnew)
执行这些步骤时,您将确保:
FooDaoFactory保持干净的依赖传递FooCloudDao 在没有真实会话的情况下测试你的代码(你只能给出假接口实现)关于会话的注意事项:如果遇到在 中获取会话的问题SessionBasedApiTokenProvider,大多数时候会话本身也注册到 IoC 控制器,并在需要的地方注入。