【问题标题】:How should one handle dependencies among Play sub-projects?应该如何处理 Play 子项目之间的依赖关系?
【发布时间】:2013-06-28 16:48:25
【问题描述】:

在创建了一个非常混乱的 Play 项目后,我决定将其分解为子项目可能是个好主意,这样依赖关系就可以编译项目的一部分等。

不幸的是,我发现子项目对整个项目有轻微的依赖性。耦合足够小,我并不为此感到羞耻,但 SBT 不会让我声明循环依赖。 (而且我认为这是一件好事。)

这是一个例子。我有一个users 子项目,它定义了几个与用户打交道的模型。还有一些基本视图,您可能会期望与用户打交道:登录、注销、changePassword、updateSettings 等。问题是,这些都依赖于我的主模板,因此它们看起来像网站的其余部分。所以我需要一些方法让用户子项目知道它应该嵌入其视图的主模板是什么。

作为另一个例子,大多数网站都有一个“默认”页面,当用户尝试访问他们无权访问的信息时,或者在他们注销后等时,他们会将用户发送到该页面。子项目需要知道那是什么page 是这样他们可以根据需要重定向到默认页面。但是默认页面是在主项目中定义的,子项目不能依赖。

我开始尝试通过在主项目中使用 Global.onStart 方法将设置“注入”到子项目中来解决这个问题。例如,我创建了一个var 来保存默认页面,然后在应用程序启动时将controllers.users.App.defaultPage 设置为正确的值。但后来我意识到每个子项目都需要一些钩子来告诉它如何适应主项目,而试图手动跟踪所有这些只是自找麻烦。

有没有人想出处理这个问题的好方法?每个子项目是否应该有一个主项目可以修改的默认Configuration?有没有办法让每个子项目声明它需要什么配置,以便主项目未能提供它会触发错误?我应该为我的代码的耦合程度感到羞耻,然后回到绘图板上吗?

谢谢!

【问题讨论】:

  • 这是一个很好的问题,也是我最近一直在努力解决的问题。子项目是让 Play 应用更易于管理的好方法,但我发现如果没有大量涉及可变配置的 hack,在实践中很难实现。
  • 我们有一些配置注入,但没有突变。你为什么要让你的配置可变?
  • 此时,权宜之计,差不多了!当一切正常时,我将研究 DI 解决方案; onStart 处理程序中填充的可变映射只是概念验证这个东西的最快方法。如果您有 github 链接或其他内容,将有兴趣了解您的案例的更多细节。

标签: scala dependency-injection sbt playframework-2.1


【解决方案1】:

经过更多搜索,我发现了这个博客条目。我将试一试,看看它是如何工作的:

http://eng.42go.com/play-framework-dependency-injection-guice/

在使用了几周后,它基本上是成功的。仍然有先有鸡/先有蛋的问题需要解决,但我认为那是因为我没有真正考虑过我的每个子项目在多大程度上依赖于其他子项目。

仍然没有真正简单的方法可以访问您不依赖的项目部分的路由,但无论如何,您可能不应该链接到您不依赖的项目。我确实想出了如何为我的“未找到”、“需要权限”和“登录”页面等内容指定主模板和 url/调用,以便所有子项目都可以访问它们。

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 2011-03-01
    • 2021-03-12
    • 2015-12-03
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2021-09-03
    相关资源
    最近更新 更多