Çok fazla bağımlılık, sınıfın kendisinin çok fazla şey yaptığını gösterebilir. Çok fazla iş yapıp yapmadığını belirlemek için:
Gerçek bağımlılıklara bakarak, kötü şeylerin olacağını gösteren hiçbir şey görmüyorum:
IDbContextFactory - veritabanı için bağlam oluşturma.
Tamam, muhtemelen sınıfların veri erişim katmanıyla etkileşime girdiği bir iş katmanının içindeyiz. İyi görünüyor.
IMapper - Varlıklardan etki alanı modellerine eşleme.
Genel resim olmadan bir şey söylemek zor. Mimarinin yanlış olması ve eşlemenin doğrudan veri erişim katmanı tarafından yapılması gerekebilir veya mimarinin mükemmel şekilde olması olabilir. Her durumda, bu bağımlılığın burada olması mantıklıdır.
Başka bir seçenek, sınıfı ikiye bölmek olacaktır: biri haritalama ile, diğeri gerçek iş mantığı ile ilgilidir. Bu, BL'yi DAL'den daha da ayıracak fiili bir katman yaratacaktır. Eşlemeler karmaşıksa, iyi bir fikir olabilir. Bununla birlikte, çoğu durumda, sadece işe yaramaz karmaşıklık katacaktır.
IClock - Özetleri DateTime.Şimdi birim testlere yardımcı olun.
Sadece şimdiki zamanı elde etmek için ayrı bir arayüze (ve sınıfa) sahip olmak çok yararlı değildir. Ben sadece DateTime.Now
şimdiki zaman gerektiren yöntemlere geçmek istiyorum .
Zaman dilimleri veya tarih aralıkları gibi başka bilgiler varsa, ayrı bir sınıf anlamlı olabilir.
IPerformanceFactory - belirli yöntemler için yürütme süresini ölçer.
Bir sonraki noktaya bakın.
ILog - Günlüğe kaydetme için Log4net.
Bu tür transcendant işlevler çerçeveye ait olmalı ve gerçek kütüphaneler çalışma zamanında değiştirilebilir ve yapılandırılabilir olmalıdır (örneğin, .NET'teki app.config üzerinden).
Ne yazık ki, bu (henüz) bir kütüphane seçmenize ve ona bağlı kalmanıza veya gerektiğinde kütüphaneleri değiştirebilmeniz için bir soyutlama katmanı oluşturmanıza izin veren durum değildir. Niyetiniz özellikle kütüphane seçiminden bağımsız olmaksa, bunu seçin. Kütüphaneyi yıllarca kullanmaya devam edeceğinizden eminseniz, soyutlama eklemeyin.
Kütüphane kullanmak için çok karmaşıksa, bir cephe deseni mantıklıdır.
ICollectionWrapperFactory - Koleksiyonlar oluşturur (IEnumerable'ı genişletir).
Bunun etki alanı mantığı tarafından kullanılan çok spesifik veri yapıları oluşturduğunu varsayacağım. Bir yardımcı program sınıfına benziyor. Bunun yerine, ilgili kurucularla veri yapısı başına bir sınıf kullanın. Başlatma mantığı bir kurucuya sığacak şekilde biraz karmaşıksa, statik fabrika yöntemlerini kullanın. Mantık daha da karmaşıksa, fabrika veya bir oluşturucu deseni kullanın.
IQueryFilterFactory - db'yi sorgulayacak girdiye dayalı sorgular oluşturur.
Neden veri erişim katmanında değil? Adında neden a var Filter
?
IIdentityHelper - Giriş yapan kullanıcıyı alır.
Neden bir Helper
sonek olduğundan emin değilim . Her durumda, diğer sonekler de özellikle açık olmaz ( IIdentityManager
?)
Her neyse, bu bağımlılığın burada olması çok mantıklı.
IFaultFactory - Farklı FaultExceptions oluşturun (WCF kullanıyorum).
Bu kadar karmaşık bir mantık fabrika paterni kullanmayı gerektiriyor mu? Bunun için Bağımlılık Enjeksiyonu neden kullanılır? Üretim kodu ve testler arasında istisnaların oluşturulmasını değiştirir misiniz? Neden?
Bunu basitçe yeniden düzenlemeye çalışırdım throw new FaultException(...)
. Bazı genel bilgilerin istemciye yayılmadan önce tüm istisnalara eklenmesi gerekiyorsa, WCF muhtemelen işlenmeyen bir istisna yakaladığınız ve değiştirip istemciye yeniden gönderebileceğiniz bir mekanizmaya sahiptir.
Kaliteyi rakamlarla ölçmek, genellikle ayda yazdığınız kod satırları tarafından ödenmesi kadar kötüdür. İyi tasarlanmış bir sınıfta çok sayıda bağımlılığınız olabilir, çünkü birkaç bağımlılık kullanarak boktan bir sınıfa sahip olabilirsiniz.
Birçok bağımlılık mantığı takip etmeyi daha zor hale getirir. Eğer mantığı takip etmek zorsa, sınıf muhtemelen çok fazla şey yapıyor ve bölünmesi gerekiyor.