【问题标题】: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 因素似乎比我最初想象的更相关。我已经添加了标签。

标签: java android data-access-layer dao


【解决方案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 应用程序,并且您正在滚动列表,那么 SlowAdapterEfficientAdapter 可能就是您要寻找的。

【讨论】:

  • 如果数据访问层的任务不是实际构建域对象,而只是为要构建的列表对象提供相关信息(在本例中为 json 字符串),那么我删除循环依赖(虽然我意识到它不再是 DAL/DAO,而只是一个适配器)。你怎么看?
【解决方案4】:

如果我对您的理解正确,那么您正在实施的是分页。您的解决方案是我将如何(并且已经)自己实现它。

将 DAL 传递给构造函数本身并不坏。最佳实践是使用Dependency Injection 框架(Spring 是一个突出的例子),以避免层之间的“硬编码”依赖关系。

但既然你提到了 Android,我怀疑使用这样的框架是一个好主意,甚至是可能的。 (也许 Android 内置了某种 DI?)

总而言之,您似乎已经对您的应用程序架构进行了一些思考。我不会担心将参数传递给构造函数。

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 2011-05-29
    • 2020-04-25
    • 2010-10-22
    • 2011-11-20
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多