目前,我的应用程序架构流程如下:
查看→演示者→某些异步执行器→DAOFactory→DAO(接口)→DAO(Impl)
目前,这种架构有效;主要是因为我此刻只需要一种DAO。但随着需求的增长,我需要扩展到多个DAO,每个DAO都有自己的实现如何获取数据。
以下是我案例的说明:
主要问题来自FooCloudDao
,它从API加载数据。此API需要某种身份验证方法 - 在登录期间存储的字符串标记(例如,Session
对象 - 是的,它也有自己的DAO。)
将Session
实例传递给FooDaoFactory
是很诱人的,以防万一没有连接,但它似乎是hackish和反直觉。我可以想象的下一件事是从SessionDAOFactory
内访问FooDaoFactory
以获得Session
的实例(然后在需要FooCloudDAO
实例时传递它)。
但正如我所说,我不确定我是否可以做这样的事情 - 好吧,可能是我可能,但这是真的这样做的正确方法?
答案 0 :(得分:1)
我认为你的问题实际上是FooCloudDao
有不同的依赖关系"比其他组件,你想避免在途中通过每个类传递依赖。
尽管有一些设计模式可以解决你的问题,我建议你看看 依赖注入/控制反转 原则和框架。你要做的是:
- 您可以为
醇>FooCloudDao
需要的内容创建界面,例如:
interface ApiTokenProvider {
string GetToken();
}
- 您将创建该接口的实现,该接口将从会话或其中的任何位置获取:
醇>
class SessionBasedApiTokenPrivider implements ApiTokenProvider {
public string GetToken() {
// get it from the session here
}
}
上面定义的类需要在您选择的IoC容器中注册为
ApiTokenProvider
的实现 接口(以便任何要求ApiTokenProvider
的人将被解耦 从实际实施 - >容器会给他 正确实施)。- 醇>
你的
FooCloudDao
类会有一些叫做构造函数注入的东西(容器稍后会用到"注入" 你的依赖):
public FooCloudDao(ApiTokenProvider tokenProvider) {
// store the provider so that the class can use it later where needed
}
- 您的FooDaoFactory将使用 IoC容器来解析
实例化FooCloudDao
及其所有依赖项(因此您不会 使用FooCloudDao
)new
醇>
执行这些步骤后,您将确保:
FooDaoFactory
仍然没有通过FooCloudDao
(您只能在假接口实现中提供)会话注意事项:如果遇到SessionBasedApiTokenProvider
中的会话问题,大多数情况下会话本身也会在IoC控制器中注册,并在需要时注入。