gpt4 book ai didi

scala - 关于蛋糕图案的问题

转载 作者:行者123 更新时间:2023-12-04 14:51:28 25 4
gpt4 key购买 nike

让有几个单独的 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使用蛋糕图案有什么不同?

它提供了什么,而像 Spring 这样的 DI 框架没有?

如何创建单独的 OrderDAOImplProductDAOImpl共享相同的对象 DataSource实例而不是一个大 DAOImpl ?

最佳答案

蛋糕图案的优点是:

  • 与基于配置文件的 DI 解决方案不同,将合约匹配到
    实现是在编译时完成的,这减少了类查找
    和兼容性问题。但是,许多 DI 引擎具有
    替代代码内配置功能
  • 没有第三方库
    被使用。允许您使用模式的自类型注释是
    母语功能。没有使用特殊语法来检索
    契约(Contract)执行
  • 忘记指定一个
    另一个组件所需的组件的实现导致
    运行时错误 - 只需查看这篇文章
    http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html
    并尝试不指定其中一个组件或指定一个
    trait 而不是任何蛋糕模式中的具体类
    示例,甚至忘记初始化与所需组件相对应的 val

  • 然而,要体验这些优势,您需要更严格地遵守模式的架构——查看同一篇文章并注意包含实际契约和实现的包装特征。

    你的例子似乎不是严格的蛋糕模式。在您的情况下,您可以只使用继承来为您的特征创建实现,并为每个 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.//

    关于scala - 关于蛋糕图案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680035/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com