将 DAO 注入构造函数是不是被认为是不好的做法?如果是这样,为啥?
Posted
技术标签:
【中文标题】将 DAO 注入构造函数是不是被认为是不好的做法?如果是这样,为啥?【英文标题】:Is it deemed bad practice to inject the DAO into the constructor? and if so, why?将 DAO 注入构造函数是否被认为是不好的做法?如果是这样,为什么? 【发布时间】:2011-12-01 12:39:23 【问题描述】:我有一个 (DAL) 数据访问层(但这个问题也与 DAO 相关),它正在与 android 中的一个安静的 Web 服务进行通信(除了我不想包含重restful 库,因为交互并不复杂)。
我有一个对象,它包装了一个列表,该列表由来自该数据访问层的信息填充,当用户向下扫描并到达该列表的底部时,该对象从 DAL 检索另一组信息。
我希望这个列表包装对象的调用类只需要调用列表包装对象而不是 DAL(或 DAO)。然后我可以构造单个 DAL 并将其传递给这些列表包装对象的构造函数,然后调用类可以继续调用此列表包装对象,并且该对象可以处理新信息的检索。
那么,这听起来像是不好的做法还是只是一个非常糟糕的解释?
在域对象的构造函数中注入 DAL 和 DAO 是不是一个坏主意?
【问题讨论】:
如果问题是特定于 Android 的,将其作为标签是否有意义? 希望它是一个更普遍的问题,但事后看来,android 因素似乎比我最初想象的更相关。我已经添加了标签。 【参考方案1】:答案取决于您是否对“贫血的领域模型”以及将面向对象与函数式编程相结合的感觉强烈。
一个问题是您会以这种方式创建循环依赖:模型和持久性包必须相互了解。如果您使用更实用的样式,并且不给模型对象提供 DAO 引用,那么它是一种单向关系。
我不太喜欢你的设计。我担心它太耦合了。我不介意混入功能风格。
【讨论】:
如果数据访问层的任务不是实际构建域对象,而只是为要构建的列表对象提供相关信息(在本例中为 json 字符串),那么我删除循环依赖(虽然我意识到它不再是 DAL/DAO,而只是一个适配器)。你怎么看? 额外的复杂性,我看不到任何好处。【参考方案2】:Domain Objects
通常是没有任何实际逻辑的数据载体。因此,我认为将它与您的 DAO
逻辑紧密结合是不好的设计。一般逻辑可能类似于:
public class DataService
private DAO dao;
public class UserService
private DataService svc;
public DomainObject createDomainObject()
return new DomainObject(dao.getData());
【讨论】:
这句话 -Domain Objects are typically data carriers without any real logic
,有点不正确。领域对象旨在具有业务逻辑并成为丰富领域模型的一部分,这与旨在作为数据载体的 DTO 不同(并且在贫乏的领域模型中发现)。【参考方案3】:
你在那里引入了循环依赖,所以它不是最好的设计。
如果您正在开发一个 android 应用程序,并且您正在滚动列表,那么 SlowAdapter 和 EfficientAdapter 可能就是您要寻找的。
【讨论】:
如果数据访问层的任务不是实际构建域对象,而只是为要构建的列表对象提供相关信息(在本例中为 json 字符串),那么我删除循环依赖(虽然我意识到它不再是 DAL/DAO,而只是一个适配器)。你怎么看?【参考方案4】:如果我对您的理解正确,那么您正在实施的是分页。您的解决方案是我将如何(并且已经)自己实现它。
将 DAL 传递给构造函数本身并不坏。最佳实践是使用Dependency Injection 框架(Spring 是一个突出的例子),以避免层之间的“硬编码”依赖关系。
但既然你提到了 Android,我怀疑使用这样的框架是一个好主意,甚至是可能的。 (也许 Android 内置了某种 DI?)
总而言之,您似乎已经对您的应用程序架构进行了一些思考。我不会担心将参数传递给构造函数。
【讨论】:
以上是关于将 DAO 注入构造函数是不是被认为是不好的做法?如果是这样,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?