2013-02-25 10 views
5

Ben github örnek pet kliniği grails app bakıyordu.Good Grails hizmetine bir kayıt yöntemi eklemek için Bakımı yapılabilir yol

bir ekleme hayvanlar için bir yöntem vardır PetclinicService adı hayvan oluşturmak için olan bir hizmete sahip: bir merak ediyorum

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

: şöyle denetleyicisinden kullanılıyor

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 
} 

Bu, bir şeyleri grails'e kaydetmenin en iyi yolu olup olmadığını biliyor mu? Bu yaklaşımla Pet etki alanına başka bir alan eklediğimde, String color deyin, daha sonra değişikliklerin tamamlanması için üç sınıfa (Pet, PetController, and PetclinicService) dokunmak zorunda kalacağım.

params nesnesinin tamamını hizmete göndermenin ve otomatik olarak etki alanına eşlenmesini sağlamanın bir yolu var mı? Standart params haritadaki geçmektir çünkü

Class PetclinicService { 
    Pet createPet(Map params) { 
    def pet = new Pet(params) 
    pet.save() 
    pet 
    } 
} 

cevap

7

O değişikliği yapan, ancak bu birkaç nedenden dolayı kötü:

+0

Yani, içindeki params' haritasının servisini kötü kullanıyor uygulama? Denetleyicide 'params' ile çalışmak için tetter mi? – havenchyk

1

sadece Map olarak beyan, servise tüm params gönderebilir. Biri, hizmet katmanını web katmanına birleştirmesidir. Bu sadece bir Harita olduğu için sıkı bir bağlantı değildir, ancak hizmetler yeniden kullanılabilir ve bağımsız olmalıdır. Diğeri ise haritanın kullanmak için anahtarları bilmeniz gereken bir "sihirli" harita olmasıdır. Adlandırılmış ve yazılan yöntem argümanlarını kullanarak, kod daha okunaklı ve anlaşılırdır.

Yeni bir alan eklemenin işaret değiştirmeyi gerektirdiğini belirttiğinizden bu bir bakım yükü ekler, ancak ideal olarak bu yöntem bu işin yapıldığı yer olacaktır, bu nedenle yalnızca tek bir yerde değiştirmeniz gerekir.

Kendi kodunuzda params'u kullanmaktan çekinmeyin, ancak bu proje bizim demo projelerimizden biri olduğu için mümkün olan en iyi uygulamaları kullanmak istedim.

+2

Verilerinizi bu şekilde bağladığınızda, "params" ın kullanıcı girdisinden geldiğini ve beklemediğiniz özellikleri içerdiğini unutmayın. Bkz. Http://blog.springsource.org/2012/03/28/secure-data-binding-with-grails/ – ataylor

+0

Doğru, +1 link için :) –

2

Hayvan kliniği uygulamasının kullandığı desen oldukça iyi bir en iyi uygulamadır. Hizmet katmanına params10 sızan Örneğin, bir servisi tekrar kullanmak daha zor olacaktır. Ayrıca, hizmet yöntemleriniz, yöntem parametreleri biçiminde açık bir arabirime sahipse, sınama basitleştirilir.

İlgili konular