【发布时间】: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