5

githubでサンプルのペットクリニックgrailsアプリを見ていました。

PetclinicServiceペットを追加する方法があると呼ばれるペットを作成するためのサービスがあります。

Pet createPet(String name, Date birthDate, long petTypeId, long ownerId) {
    def pet = new Pet(name: name, birthDate: birthDate, type: PetType.load(petTypeId), owner: Owner.load(ownerId))
    pet.save()
    pet
}

これは、次のようにコントローラーから使用されています。

def pet = petclinicService.createPet(params.pet?.name, params.pet?.birthDate,
    (params.pet?.type?.id ?: 0) as Long, (params.pet?.owner?.id ?: 0) as Long)

これが何かをグレイルに保存するための最良の方法であるかどうか知りたいのですが?このアプローチでは、Petドメインに別のフィールドを追加する場合、たとえば、変更を完了するには、String color3つのクラス()に触れる必要があります。Pet, PetController, and PetclinicService

paramsオブジェクト全体をサービスに送信して、ドメインに自動的にマップさせる方法はありますか?

4

3 に答える 3

7

標準がparamsマップを渡すことであるため、この変更を行いましたが、これはいくつかの理由で悪いことです。1つは、サービス層をWeb層に結合することです。これは単なるマップであるため、厳密な結合ではありませんが、サービスは再利用可能で独立している必要があります。もう1つは、マップが「魔法の」マップであり、使用するためにキーを知る必要があるということです。名前付きおよび型指定されたメソッド引数を使用することにより、コードがより読みやすく、理解しやすくなります。

新しいフィールドを追加するには署名を変更する必要があるため、これによりメンテナンスの負担が増えますが、理想的にはこの方法がこの作業を行う1つの場所になるため、1か所で変更するだけで済みます。

独自のコードで自由に使用できparamsますが、このプロジェクトはデモプロジェクトの1つであるため、可能な場合はベストプラクティスを使用する必要がありました。

于 2013-02-25T19:03:28.223 に答える
2

ペットクリニックアプリが使用しているパターンは、かなり良いベストプラクティスです。

サービスレイヤーにリークparamsすると、サービスがコントローラーレイヤーにさらに緊密に結合されます。たとえば、APIでサービスを再利用するのは難しいでしょう。また、サービスメソッドにメソッドパラメータの形式の明示的なインターフェイスがある場合、テストは簡素化されます。

于 2013-02-25T19:03:57.957 に答える
1

全体paramsをサービスに送信できます。次のように宣言しMapます。

Class PetclinicService {
  Pet createPet(Map params) {
    def pet = new Pet(params)
    pet.save()
    pet
  }
}
于 2013-02-25T18:57:37.673 に答える