让一些单独的DAO类OrderDAO
,ProductDAO
和CustomerDAO
在数据库中存储/检索数据并共享单个实例DataSource
(数据库连接)厂)。
为了创建DataSource
实例并将其插入DAOs
,我们通常使用Spring DI。现在我想在没有任何DI框架的Scala中做到这一点。
我已经阅读了cake pattern,看起来我应该执行以下操作:
trait DatabaseContext { val dataSource:Datasource }
trait OrderDAO {this:DatabaseContext =>
... // use dataSource of DatabaseContext
}
trait ProductDAO {this:DatabaseContext =>
... // use dataSource of DatabaseContext
}
object DAOImpl extends OrderDAO with ProductDAO with DatabaseContext {
val dataSource = ... // init the data source
}
我能正确理解蛋糕图案吗?
我可以使用蛋糕模式以不同的方式实现这些DAOs
吗?
它提供的像Eclipse这样的DI框架没有提供什么?
如何创建单独的OrderDAOImpl
和ProductDAOImpl
个对象,共享相同的DataSource
个实例,而不是一个大的DAOImpl
?
答案 0 :(得分:5)
蛋糕模式的优点是:
但是,要体验这些优势,您需要更严格地遵循模式的体系结构 - 检查相同的文章并注意包含实际合同和实现的包装特征。
你的例子似乎不是严格意义上的蛋糕模式。在您的情况下,您可以只使用继承来为您的特征创建实现,并为每个DAO组件使用单独的类。在蛋糕模式中,消费代码就像DAO代码一样是一个组件,将依赖项组合在一起的代码就可以独立于它。
为了说明蛋糕模式,您必须在示例中添加消费类(域层或UI层)。或者你的DAO组件访问彼此的功能,你可以单独说明DAO上的蛋糕模式。
简而言之,
trait OrderDAOComponent {
val dao: OrderDAO
trait OrderDAO {
def create: Order
def delete(id: Int): Unit
//etc
}
}
trait OrderDAOComponentImpl extends OrderDAOComponent {
class OrderDAOJDBCImpl extends OrderDAO {
def create: Order = {/*JDBC-related code here*/}
def delete(id: Int) {/*JDBC-related code here*/}
//etc
}
}
//This one has a dependency
trait OrderWebUIComponentImpl {
this: OrderDAOComponent =>
class OrderWebUI {
def ajaxDelete(request:HttpRequest) = {
val id = request.params("id").toInt
try {
dao.delete(id)
200
}
catch {
case _ => 500
}
}
}
}
//This matches contracts to implementations
object ComponentRegistry extends
OrderDAOComponentImpl with
OrderWebUIComponentImpl
{
val dao = new OrderDAOJDBCImpl
val ui = new OrderWebUI
}
//from some front-end code
val status = ComponentRegistry.ui.ajaxDelete(request)
更多关于你的例子。我想如果它可能更像蛋糕:
trait DatabaseContext { val dataSource:Datasource }
trait OrderDAOComponent {this:DatabaseContext =>
trait OrderDAOImpl {
... // use dataSource of DatabaseContext
}
}
trait ProductDAOComponent {this:DatabaseContext =>
trait ProductDAOImpl {
... // use dataSource of DatabaseContext
}
}
object Registry extends OrderDAOComponent with ProductDAOComponent with DatabaseContextImpl {
val dataSource = new DatasourceImpl //if Datasource is a custom trait, otherwise wrapping needed
val orderDAO = new OrderDAOImpl
val productDAO = new ProductDAOImpl
}
//now you may use them separately
Registry.orderDAO.//
答案 1 :(得分:2)
也许: