2009-12-31 13 views
13

Yaklaşık 7 parametre gerektiren CSV dosya işleminden içe aktarılan ürünler için bir sınıfım var. Bu, ithalatçı için kesinlikle gerekli olan bir bilgidir.Yapıcı tabanlı ve ayarlayıcı tabanlı enjeksiyonları kötü bir şey karıştırıyor mu?

Bu parametrelerin hepsi aynı yaşam süresine sahiptir. Sonunda bir Immutable Object olmalı.

Okunabilirlik üzerindeki etkisi nedeniyle hepsini kurucuda listelemek için çok korktum ve 3'ü setter enjeksiyonu yapmaya karar verdim. Ama açıkçası bu zarif bir çözüm değil.

Sorular:

1) yapıcı tabanlı ve ayarlayıcı tabanlı enjeksiyonları kötü uygulama karıştırma mı?

2) Bu sorun nasıl çözülebilir?

Martin Fowler tarafından yapılan "Parametre Nesnesini Tanıt" ın uygulanmasını düşünüyordum, ancak bununla ilgili bir sorun var.

4 Parametreler çok kolay bir şekilde Parametre nesnesine taşınır (customerId, projectId, languageId vb.) - tüm tamsayılar.

Diğer 3 parametre enjekte ettiğim bir nesnedir (Mock birim testleri için gereklidir).

+0

Bu, DI kabınıza bağlı olacaktır ... bazıları bunu diğerlerinden daha kolay hale getirir. – skaffman

+4

@skaffmann: Kesinlikle katılmıyorum. DI kalıplarının kullanılması DI Container'ın seçimi ile belirlenmemelidir - konteyner sizi kısıtlamak için size yardımcı olmak üzere oradadır. –

+0

@Nikita - neden tam parametre nesnesini tanıtmıyorsunuz ve atasözlerinizi parametreye enjekte etmiyorsunuz? –

cevap

22

Yapıcı Enjeksiyon ve Mülkiyet Enjeksiyonunu karıştırmak kötü bir şey değildir, ancak bu yaygın olmayabilir. Genel bir strateji olarak, doğru bir şekilde uygulanması çok daha zor olduğu için Mülkiyet Enjeksiyonundan kaçının (bu, karşı sezgisel gelebilir, ancak doğrudur).

Her bir kalıbın ne zaman kullanılacağını anlamak önemlidir.

  • Oluşturucu Enjeksiyon varsayılan enjeksiyon deseniniz olmalıdır. Uygulaması süper kolaydır ve değişmezleri garanti edebilir: Tüketicinin değişmezlerini sağlamak için bunu salt okunur bir alana atayabilirsiniz.
  • Mülk Enjeksiyonu, iyi bir Yerel Varsayılan uygulamanız olduğunda kullanılabilir, ancak Open/Closed Principle numaralı telefonu takip etmek ve gelişmiş kullanıcıların alternatif bir uygulama sunarak sınıfı genişletmelerine izin vermek için kullanabilirsiniz.

Kurucu kozmetiklerinden dolayı Asla Enjeksiyon'u asla uygulamamalısınız.

Çok fazla bağımlılık istediğinizde, Single Responsibility Principle numaralı telefonu ihlal ediyor olabilirsiniz - bu sınıf bir kerede çok fazla uğraşmaya çalışıyor. Bunun yerine bir parametre Nesnesi (Aksi iyi bir öneri) tanıtılması

, daha iyi bir seçenek bu bağımlılıkları etkileşimi orchestrates bir bütünleştirici, hizmete içine bağımlılıkları iki veya daha fazla kapsüllemek olmaktadır.

İlk yapıcı şöyle düşünün:

public MyClass(IDep1 dep1, IDep2 dep2, IDep3 dep3, IDep4 dep4, IDep5 dep5) 

analiz biraz uyguladıktan sonra, bu durumda yılında IDep1, IDep3 ve IDep4 belirli bir şekilde birbirine kullanılacağını anlamaya.

public class AggService : IAggService 
{ 
    public AggService(IDep1 dep1, IDep3 dep3, IDep4 dep4) 
    { 
     // ... 
    } 

    // ... 
} 

Artık bu özgün yapıcı yazabilirsiniz: Bu böyle bu kapsüllü bir toplama hizmetini tanıtmak sağlayacak

... vb

public MyClass(IAggService aggSrvc, IDep2 dep2, IDep5 dep5) 

ve O Toplu hizmetin kendi başına doğru bir kavram olduğu ortaya çıktı ve aniden başladığınız zamankinden daha zengin bir API'ye sahipsiniz.

+0

Bir toplama hizmeti bir Parametre Nesnesinden nasıl farklıdır? Görünüşe göre, alan modeli ile daha somut ve somut bir ilişkisi olabilir, ama iyi tasarlanmış parametre nesneleri için geçerli olmalı, değil mi? –

+0

Çok açık ve ilginç. Mükemmel cevap. Teşekkür ederim Mark! – ep3static

+0

@Jeff Sternal: Toplama hizmeti, bir Parameter Nesnesinden çok farklı olmayabilir, ancak toplama hizmetleri, Hollywood Prensibine (iyi bir şey) daha fazla eğilim gösterir. Parametre Nesneleri normal olarak, tek tek çıkarabileceğiniz ve tek tek kullanabileceğiniz ilgili nesneleri tutan yapılardır. Bir toplama hizmeti, bu bağımlılıkları tüketiciden gizleyecek ve bunun yerine genel işlevsellik sunacaktır. –

İlgili konular