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/

これを数週間使用した後、ほとんど成功しています。ニワトリが先かタマゴが先かという問題がまだ残っていますが、それは、自分のサブプロジェクトがどれだけ他のプロジェクトに依存しているかをよく考えていなかったからだと思います。

依存していないプロジェクトの部分からルートにアクセスする簡単な方法はまだありませんが、依存していないプロジェクトにリンクするべきではないでしょう。すべてのサブプロジェクトがアクセスできるように、「Not Found」、「Permission Required」、「Login」ページなどのメイン テンプレートと URL/呼び出しを指定する方法を理解しました。

于 2013-07-01T02:59:47.563 に答える