- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用接口(interface)、抽象类和泛型在 Java 中创建一个相当复杂的结构。由于没有使用泛型的经验,在创建良好的 OOP 设计方面只有一般经验,这开始证明是一个相当大的挑战。
我有种感觉,我想做的事情实际上无法完成,但我可以接近它。我会尽量简短地解释一下。我只想直接告诉你,这个结构将代表我的 DAO 和服务层来访问数据库。让这个问题更抽象只会让它变得更难。
我的 DAO 层完全没问题。有一个通用 DAO 接口(interface),对于每个实体,都有一个扩展通用接口(interface)并填充通用类型的 DAO 接口(interface)。然后有一个由每个 DAO 实现扩展的抽象类,后者又实现相应的接口(interface)。很可能读起来很困惑,所以这里以产品的 DAO 为例:
现在对于服务类,我有一个类似的结构。无论如何,服务类中的大多数方法都映射到 DAO 方法。 如果你用“服务”替换上图中的每个“DAO”,你就得到了我的服务层的基础。但是我想做一件事,基于我的以下想法:
Every service class for an entity will at least access one DAO object, namely the DAO of the entity that it is designed for.
这是...
如果我可以进行适当的 OO 设计以使每个服务类都为其各自实体的 DAO 对象拥有一个实例变量,在我看来,我的服务层将是完美的。 欢迎就此提出建议,以防我的设计不如看上去的那么好。
我是这样实现的:
public abstract class AbstractService<EntityDAO> {
EntityDAO entityDAO;
public AbstractService() {
entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor
}
abstract EntityDAO makeEntityDAO();
}
public class ProductServiceImpl extends AbstractService<ProductDAOImpl> {
public ProductServiceImpl() {
super();
}
@Override
ProductDAOImpl makeEntityDAO() {
return new ProductDAOImpl();
}
}
此设计的问题是我不喜欢的编译器警告:它在构造函数中有一个可覆盖的方法调用(请参阅评论)。现在它被设计为可重写的,事实上我强制执行它是为了确保每个服务类都有对相应 DAO 的引用。这是我能做的最好的事情吗?
我已尽最大努力包含您可能需要的所有内容,并且仅包含您对此问题所需的内容。我现在要说的是,欢迎评论,更广泛的回答,感谢您花时间阅读。
最佳答案
首先要注意一点:通常在按层组织的应用程序中,例如 Presentation/Service/DAO,您有以下规则:
这将提供更容易的测试、更好的代码封装以及对不同层的更清晰的定义(通过易于识别为公共(public) API 的接口(interface))
就是说,有一种非常通用的方法可以以最灵活的方式处理这种情况:dependency injection .和 Spring是依赖注入(inject)(以及许多其他事物)的行业标准实现
这个想法(简而言之)是您的服务将知道它需要一个 IEntityDAO,并且 某人 将在实际使用之前注入(inject)它和接口(interface)的实现服务。那个某人 称为 IOC 容器(Inversion of Control 容器)。可以是Spring , 它所做的通常由应用程序配置文件描述,并将在应用程序启动时完成。
重要说明: 这个概念非常出色和强大,但却非常简单愚蠢。您还可以在没有框架的情况下使用控制反转架构模式,其实现非常简单,其中包含一个大型静态方法“组装”您的应用程序部分。但在工业环境中,最好有一个允许注入(inject)其他东西的框架,如数据库连接、Web 服务 stub 客户端、JMS 队列等......
好处:
示例 java 代码:
public abstract class AbstractService<IEntityDAO> {
private IEntityDAO entityDAO; // you don't know the concrete implementation, maybe it's a mock for testing purpose
public AbstractService() {
}
protected EntityDAO getEntityDAO() { // only subclasses need this method
}
public void setEntityDAO(IEntityDAO dao) { // IOC container will call this method
this.entityDAO = dao;
}
}
在 spring 配置文件中,你会有这样的东西:
<bean id="ProductDAO" class="com.company.dao.ProductDAO" />
[...]
<bean id="ProductService" class="com.company.service.ProductService">
<property name="entityDAO" ref="ProductDAO"/>
</bean>
关于java - 需要有关 java 中复杂结构的建议(DAO 和服务层链接/耦合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239354/
我有组件需要更新客户和客户地址的数据库(通过 JDBC)。从 CustomerDAO 调用 CustomerAddressDAO 是否合适?或者创建一个单独的“CustomerDataManager”
任何人都可以解释MS Access 2007中DAO.Recordset,DAO.Recordsets和DAO.Recordset2之间的区别吗?基本上使用记录集。...举一个例子,使它更清晰。我从“
所以我正在编写一个个人项目来学习 Web 编程,并且我遇到了 DAO 模式。我构建了一些类(模型),并且像几乎所有程序一样,它们是嵌套的(例如:类 Payment 具有对 Author 实例的引用)。
我有一个基本问题。 我一直在创建关注点分离的 DAO。每个 DAO 都专注于上下文中的 BusinessObject。我的问题是如何在另一个 DAO 中使用一个 DAO 方法。我认为这是错误的,但没有
有没有办法使用 Android Room Persistence Library 将 DAO 作为依赖项添加到其他 DAO 中,也许是使用 Dagger2?我试图避免在使用事务对多个表执行操作的 DA
通常,我会尝试以一种完全依赖于自身的方式来构建我的 DAO 类。它们可以与多个表交互,但前提是数据与基础对象相关。例如,假设我有一个约会对象,约会 DAO 从约会表中提取数据。如果约会表是一个服务 i
在学校学习过 Java 后,我对 DAO 模式( Data access object )非常熟悉。然而在工作中我使用.NET。在 .NET 中,经常讨论 DAL( Data Access Layer
我一直在尝试按照以下步骤创建一个通用的 DAO: http://www.ibm.com/developerworks/java/library/j-genericdao/index.html 不过,我
Java EE 中的最佳实践是什么? 在服务(或管理器)类中创建 DAO 类的实例 SalesDAO salesDao = new SalesDAOImpl(); salesDao.findCusto
这有道理吗? 假设我需要从 DB 中获取一个对象,该对象与另一个对象有关系(由 DB 中的外键表示,并由我的域对象中的组合表示)。如果在我的第一个 DAO 中,我为对象 1 获取数据,然后为对象 2
我目前正在为应用程序创建数据访问层。此应用程序最初将连接到 Oracle 数据库,但稍后也会连接到 DB2 数据库。 为了连接到数据库,我将使用 JDBC。在这个时候我正在考虑我的选择。在我看来,我有
我正在 JSF 中设计一些数据“块” 我从每个块的 Java bean 中获取我的数据。 我的问题是我的块从多个表中获取数据。 例如: 描述 的块客户的个人资料 由组成: 客户名称(在表 客户 中)
将 DAO 类与应用程序代码中实际实例化的 DAO 类分开有什么好处,即为什么不在这样的场景中直接实例化 DAO 类: Class CreateIocContainer{ p s v main
我正在为我的 DataNucleus JDO DAO 创建通用 DAO。通用 DAO 将执行获取、更新、删除、创建操作和一些其他通用操作,因此这些实现可以在更具体的 DAO 中进行扩展。 是否有可能以
这可能是一件非常微不足道的事情,但我是一些面向对象模式的新手。 简而言之,在另一个 DAO 中使用一个 DAO 中的方法是一种不好的做法吗?我试图在 DAO 中创建一个实体,但发现仅使用该 DAO 很
我参与了一个 Java 项目,该项目从不同的支付代理获取支付信息,对其进行处理并将其存储到我们的计费系统(数据库)中。 由于我们有不同的代理,因此支付协议(protocol)也不同,因此我们有时有相似
考虑以下 Room DAO @Dao public abstract class JobDao { @Insert public abstract long insert( Job v
我有一个“容器”类,其字段包含在多个数据库表中,我使用 DAO 模式来访问数据。 问题是,我应该为这个“容器”类创建一个 DAO,还是每个表有一个 DAO 并合并它们的数据更好? 最佳答案 您应该根据
我们正在通过 @Service 和 @Component 注释使用 Spring @Autowired 改造一个新的面向服务的架构。 我一直在和我的同事争论不让每个 DAO 都有接口(interfac
我有通用的 DAO: @NoRepositoryBean interface ICrudDao extends Repository { void delete(T deleted);
我是一名优秀的程序员,十分优秀!