私は Fantom の afBedSheet フレームワークで遊んでおり、そのドキュメント hereでは、例は次のようになります...
using afIoc
using afBedSheet
class HelloPage {
Text hello(Str name, Int iq := 666) {
return Text.fromPlain("Hello! I'm $name and I have an IQ of $iq!")
}
}
class AppModule {
@Contribute { serviceType=Routes# }
static Void contributeRoutes(OrderedConfig conf) {
conf.add(Route(`/index`, Text.fromPlain("Welcome to BedSheet!")))
conf.add(Route(`/hello/**`, HelloPage#hello))
}
}
...
上記の convertRoutes メソッドは、追加されるルートが増えるにつれて、特にルート ハンドラーが異なるクラスから来る場合に、読み取りと保守が難しくなり始めます。
私はこれを別の方法で行っています: 各 Service クラスで、次の例のように、そのメソッドによって処理されるルートのリストを返す静的メソッドを追加しています。
using afBedSheet
class Info {
static Route[] routes() {[
Route(`/info`, #all),
Route(`/info/pod`, #podAll),
Route(`/info/pod/name`, #podName),
Route(`/info/pod/version`, #podVersion),
]}
Text all() {
Text.fromJson(["This application blah blah blah"])
}
Text podAll() {
pod := Pod.of(this)
return Text.fromPlain("$pod.name $pod.version.toStr")
}
Text podName() {
Text.fromPlain(Pod.of(this).name)
}
Text podVersion() {
Text.fromPlain(Pod.of(this).version.toStr)
}
}
次に、私の AppModule は次のようになります
using afIoc
using afBedSheet
class AppModule {
@Contribute { serviceType=Routes# }
static Void contributeRoutes(OrderedConfig conf) {
Info.routes.each { conf.add(it) }
AnotherService.routes.each { conf.add(it) }
YetAnotherService.routes.each { conf.add(it) }
...
}
私は、AppModule をクリーンに保ち、Route 定義とハンドラー マッピングを実装クラスに近づけようとしています。これにより、サービス/ルートの保守が容易になると期待していますが、それが良いアイデアか悪いアイデアかはわかりません。これを行う利点は次のとおりです。
- ルート ハンドラー メソッドをクラスに追加する場合、同じクラスでルートを宣言します。
- ルート ハンドラー メソッドは同じクラスの一部であるため、スロット名を入力するだけで済みます (例: Info#podVersion ではなく #podVersion)。
しかし、私が言ったように、私は afBedSheet で遊んでいるだけです。例が示すように、AppModule クラスでルートを宣言する正当な理由があるかどうか、このフレームワークで実際の生産プロジェクトを行った人から知りたいです。 .
また、私がやっていることが OK または良い場合、上記の Info クラスを次のようなものに変更するためのファセットがあるかどうか (または追加することをお勧めするかどうか) を考えています。
using afBedSheet
@Service // Assuming there is such facet to let afBedSheet discover services
class Info {
@Route { `/info` } // <- Route handler facet
Text all() {
Text.fromJson(["This application blah blah blah"])
}
@Route { `/info/pod` }
Text podAll() {
pod := Pod.of(this)
return Text.fromPlain("$pod.name $pod.version.toStr")
}
@Route { `/info/pod/name` }
Text podName() {
Text.fromPlain(Pod.of(this).name)
}
@Route { `/info/pod/version` }
Text podVersion() {
Text.fromPlain(Pod.of(this).version.toStr)
}
}
このようなファセットが存在しない場合は、ルート宣言を AppModule に保持する正当な理由があるに違いないと思います。それらが何であるかを知りたいと思います。