Terlalu banyak dependensi dapat mengindikasikan bahwa kelas itu sendiri melakukan terlalu banyak. Untuk menentukan apakah tidak melakukan terlalu banyak:
Dengan melihat dependensi yang sebenarnya, saya tidak melihat apa pun yang mengindikasikan hal-hal buruk terjadi:
IDbContextFactory - membuat konteks untuk database.
Oke, kita mungkin berada di dalam lapisan bisnis tempat kelas berinteraksi dengan lapisan akses data. Terlihat baik.
IMapper - Memetakan dari entitas ke model domain.
Sulit mengatakan apa pun tanpa gambaran keseluruhan. Mungkin arsitekturnya salah dan pemetaannya harus dilakukan langsung oleh lapisan akses data, atau mungkin arsitekturnya baik-baik saja. Dalam semua kasus, masuk akal untuk memiliki ketergantungan ini di sini.
Pilihan lain adalah dengan membagi kelas menjadi dua: satu berurusan dengan pemetaan, yang lain berurusan dengan logika bisnis yang sebenarnya. Ini akan membuat layer de facto yang akan memisahkan BL lebih jauh dari DAL. Jika pemetaan itu rumit, itu bisa menjadi ide yang bagus. Namun, dalam banyak kasus, itu hanya akan menambah kompleksitas yang tidak berguna.
IClock - Abstracts DateTime. Sekarang dapat membantu dengan unit test.
Mungkin tidak terlalu berguna untuk memiliki antarmuka yang terpisah (dan kelas) hanya untuk mendapatkan waktu saat ini. Saya hanya akan meneruskan DateTime.Now
ke metode yang memerlukan waktu saat ini.
Kelas terpisah mungkin masuk akal jika ada beberapa informasi lain, seperti zona waktu, atau rentang tanggal, dll.
IPerformanceFactory - mengukur waktu eksekusi untuk metode tertentu.
Lihat poin selanjutnya.
ILog - Log4net untuk logging.
Fungsionalitas transendan seperti itu harus menjadi bagian dari kerangka kerja, dan pustaka yang sebenarnya harus dapat dipertukarkan dan dapat dikonfigurasi saat runtime (misalnya melalui app.config dalam .NET).
Sayangnya, ini bukan (belum) kasusnya, yang memungkinkan Anda memilih perpustakaan dan tetap menggunakannya, atau membuat lapisan abstraksi untuk dapat menukar perpustakaan nanti jika diperlukan. Jika niat Anda khusus untuk tidak bergantung pada pilihan perpustakaan, lakukan saja. Jika Anda cukup yakin bahwa Anda akan terus menggunakan perpustakaan selama bertahun-tahun, jangan tambahkan abstraksi.
Jika perpustakaan terlalu kompleks untuk digunakan, pola fasad masuk akal.
ICollectionWrapperFactory - Membuat koleksi (yang melampaui IEnumerable).
Saya akan berasumsi bahwa ini menciptakan struktur data yang sangat spesifik yang digunakan oleh logika domain. Itu terlihat seperti kelas utilitas. Sebagai gantinya, gunakan satu kelas per struktur data dengan konstruktor yang relevan. Jika logika inisialisasi sedikit rumit agar sesuai dengan konstruktor, gunakan metode pabrik statis. Jika logikanya lebih kompleks, gunakan pola pabrik atau pembangun.
IQueryFilterFactory - Menghasilkan kueri berdasarkan input yang akan meminta db.
Mengapa tidak ada di lapisan akses data? Mengapa ada Filter
nama?
IIdentityHelper - Mengambil pengguna yang login.
Saya tidak yakin mengapa ada Helper
sufiks. Dalam semua kasus, sufiks lain tidak akan terlalu eksplisit ( IIdentityManager
?)
Bagaimanapun, masuk akal untuk memiliki ketergantungan ini di sini.
IFaultFactory - Buat FaultExceptions yang berbeda (saya menggunakan WCF).
Logikanya sangat rumit sehingga diperlukan untuk menggunakan pola pabrik? Mengapa Injeksi Ketergantungan digunakan untuk itu? Apakah Anda akan menukar pembuatan pengecualian antara kode produksi dan pengujian? Mengapa?
Saya akan mencoba untuk mengubahnya menjadi sederhana throw new FaultException(...)
. Jika beberapa informasi global harus ditambahkan ke semua pengecualian sebelum menyebarkannya ke klien, WCF mungkin memiliki mekanisme di mana Anda menangkap pengecualian yang tidak tertangani dan dapat mengubahnya dan mengembalikannya ke klien.
Mengukur kualitas dengan angka biasanya sama buruknya dengan dibayar oleh baris kode yang Anda tulis per bulan. Anda mungkin memiliki banyak dependensi dalam kelas yang dirancang dengan baik, karena Anda dapat memiliki kelas jelek menggunakan beberapa dependensi.
Banyak ketergantungan membuat logika lebih sulit untuk diikuti. Jika logikanya sulit untuk diikuti, kelas mungkin melakukan terlalu banyak dan harus dibagi.