2015-07-11 14 views
5

yüzden ben senin oldu mu Burada gerçek bir seçim yok ama sürüş için etiketlemek için. Her nasılsa bir şeyleri kaçırmıyorum.nasıl bir kullanımı Google Guice en Scala/(Play 2.4.x) ile @ Enjekte ben</p> <p>Play, Google Guice taşınıyor Koolaid :) (<a href="https://github.com/google/guice" rel="noreferrer">https://github.com/google/guice</a>) içmeye hazırım

Bağımlılık Enjeksiyon çözümünün temel nedenlerinden biri olan "bizi aramayalım" zihniyetini ve daha az kırılgan ve daha fazla test edilebilir kodu alıyorum.

Bazen ancak tek istediğim, ...

Scala sadece basit kürdan ve gereğini kek fırında veya daha kötüsü sadece bir olsun, bir tane pişirme için tam bir tarifi yazmaya hissetmiyorum dil kürdan fabrikaları önemsiz yapmış gibi görünüyor (Guice'nin argümanlarından biri fabrikaların (Java'da) inşaat maliyetidir - bu yüzden bana bu argüman en azından masadan ayrılıyor ama DI sorunlarının geri kalanını reddetmiyor) biliyorum.

Scala'da bir Companion object (bir Serenity flashback'e sahip olduğum için üzgünüm - bir ana ihtiyacım var - tamam iyi gitmek için - oh ve Odersky'i o kelimelerin birleşimi için lütfen suçlamayın lütfen ...). Tabii

case class Toothpick(color: Color) 

object Toothpick { 
    def redPlease = { 
    Toothpick(Color.RED) 
    } 
} 

Eğer Toothpick "nesne" gönderme yaparak sadece tam olarak istediğiniz kürdan almak için apply ve diğer skala incelikler ile bir dizi fantezi alabilirsiniz: Kürdan sınıf için

val myShinyRedToothpick = Toothpick.redPlease 

Bu durumda Toothpickobject anında bir fabrikadır.

Kolay bir şey yapmak doğru yapmaz - sadece bunu kolaylaştırır.

Google'ın Guice genel bakış gibi görünüyor: One Factory Them All Kural.

Tamam - Bununla yaşayabilirim. İlklerini aldılar - tüm topraklara sahipler - sonsuza kadar sevgili olacaklar. Oyun bitti.

İhtiyacım olan şey, USE ürününün nasıl açılacağı konusunda bir örnek. Çıldırmış kürdanımı NORMAL Scala kodundan nasıl alabilirim?

(Sanki tam olarak noktayı kaçırmış olabileceğimi söylediğim gibi ... bu durumda, doğru yöne bakmam için her hangi bir maymun saçmalıkına ihtiyaç duymaktan çekinmeyin).

PS: Ben NEDEN bir ders gerekmez - Ben sadece NASIL içinde bir tane istiyorum.

+0

Odersky, "yardımcı modül" kullanmıştır. Anahtar kelime nesnesine sahip bir modül tanımladığınızı açıklamaktan yoruldular. –

+0

@ som-snytt ah, tarihin ilginç gelgiti. Teşekkürler - nasıl basit bir tek kelime bu kadar yanlış anlaşılmış olabilir :) – Techmag

+0

Bunun üzerinden geldi - bu yardımcı olabilir ... http://www.ibm.com/developerworks/library/j-guice/ – Techmag

cevap

0

İşte hey, burada karmaşık bir NASIL YAPILIR.

public class MyComplicatedGuiceModule extends AbstractModule { 
    protected void configure() { 
    // does some configuration stuff 
    } 

    @Provides 
    @Named("RedToothPick") 
    ToothPick provideRedToothPick() { 
    ToothPick(Color.RED) 
    } 

    @Provides 
    @Named("WhiteToothPick") 
    ToothPick provideWithToothPick() { 
    ToothPick(Color.WHITE) 
    } 
} 

Ve Sınıfınızda bu kullanmak için, böyle bir şey yapmak olacaktır: (Test edilmemiş ve iyice aptal kodu Dikkat): Neden komplikasyon: Artık

public class WildCleanToothService(@Named("RedToothPick") toothPick: ToothPick) { 
} 

, iddia doğru olur? Scala kodunun kullandığı daha az satırının nasıl kullanıldığını görün.

Benim için en büyük faydalar gerçek kodu test etmekti. Aşağıya doğru kaynaştırır: Companion nesnesini nasıl test edersiniz? Ya biraz rasgele bir servis çağırdıysa. Hizmetle nasıl dalga geçeceğiz? Takılabilir bağımlılıklar, bunları tek tek ve kolayca test etmeyi mümkün kılar.

+0

Tamamen kaçırdığım en büyük şey, SADECE bir Enjekte Edilmiş Sınıf elde etme yönteminin bir Injected sınıfından olmasıdır. (Bu, görünüşte, kastedilen "kaplumbağalar tarafından" aşağıya "kastedilen veya en azından çıkarılan şeydir.) Bu kavramı kavradığınız an, çok daha kolay hale gelir. Bununla birlikte, o zamana kadar, "kaplumbağa yığını" nın dışında denediğiniz herhangi bir Guice incantasyonu için sonsuza dek atıfta bulunduğunuz görülüyor. Yani bu, cevabın kürdanı nasıl alacağına değil, bir kürdanın talep edilebileceği kaplumbağa yığınına nasıl ulaşılacağına odaklanmak olduğu ortaya çıkıyor. – Techmag

+0

Bu kısmen doğrudur. Bu anlamda, Guice, hiyerarşinin herhangi bir yerinde herhangi bir sınıfın olmasından dolayı * kısıtlamaz. Aslında, düşünmek için bir kural, eğer 'enjekte edilmiş' bir sınıfa sahip olmak istiyorsanız, tüm bağımlılıklarının da 'enjekte edilmesi' gerektiğidir. Örneğin, tek başına bir sınıf oluşturmak, bir enjektöre referans almak ve (a) Sınıfı enjekte etmek ve Guice benim için bağımlılıkları doldurabilmektir (b) Örneği kendim yarat, tüm bağımlılıkların yönetilmesini sağlamak. benim tarafımdan. – Serendipity

İlgili konular