1

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

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

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

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

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

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

谢谢!

4

1 回答 1

1

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

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

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

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

于 2013-07-01T02:59:47.563 回答