apakah ini implementasi IoC yang benar?

Saya mencoba meningkatkan pengetahuan Inversi Kontrol saya, dan melihat beberapa kode yang ingin saya ketahui - apakah ini benar IoC?

    public class DepartmentLogic : IDepartmentLogic
    {
        private readonly IDepartmentRepository _departmentRepository;

        public DepartmentLogic(IDepartmentRepository repo)
        {
            _departmentRepository = repo;
        }

        public DepartmentLogic()
        {
            _departmentRepository = new DepartmentRepository(Constants.CONNECTION_STRING_NAME);
        }
    }

Jika pengujian unit memanggil kelas ini, ia akan meneruskan IDepartmentRepository tiruan. Namun, semua kode aplikasi utama menggunakan kelas dengan konstruktor default, yang kemudian memunculkan DepartmentRepository yang konkret.

Apakah ini benar? Saya pikir saya membaca bahwa Anda tidak boleh membuat kelas dependen baru dalam kelas panggilan Anda, seperti yang terjadi di konstruktor default, dan bahwa pembaruan DepartmentRepository yang konkret harus benar-benar terjadi di kelas yang membuat kelas ini.


person Craig    schedule 14.09.2016    source sumber
comment
Kamu benar. Kode tersebut sepenuhnya menggagalkan tujuan IoC dan berakhir dengan tipe yang digabungkan secara erat. Sepertinya mereka menciptakan konstruktor IoC hanya untuk tujuan pengujian unit daripada menggunakannya sebagai metodologi desain keseluruhan.   -  person itsme86    schedule 15.09.2016
comment
Terima kasih, @itsme86 - itulah yang saya khawatirkan. Ketika saya mempertanyakannya, saya ditanya, selain pengujian unit, tidak ada alasan lain untuk IoC, dan saya akhirnya tidak yakin bagaimana menjawabnya. Saya yakin pernyataan tersebut tidak valid, dan ada banyak alasan, namun sepertinya saya tidak dapat memilih satu pun. Bisakah Anda membantu?   -  person Craig    schedule 15.09.2016
comment
Saya kira ini merangkum kerugian dari kopling ketat dengan cukup baik.   -  person itsme86    schedule 15.09.2016


Jawaban (1)


Anda memberikan kemampuan untuk memasukkan ketergantungan ke dalam kelas.

Saat Anda mengatakan bahwa aplikasi Anda hanya menggunakan konstruktor default, Anda mengatakan bahwa Anda belum benar-benar memasukkan ketergantungan. Itu masih sulit dikodekan.

Anda perlu melangkah lebih jauh dan menyediakan beberapa mekanisme untuk membuat ketergantungan "secara dinamis" pada waktu proses dan kemudian memasukkannya ke dalam kelas (melalui Kerangka Injeksi Ketergantungan atau mekanisme khusus lainnya).

person Justin Niessner    schedule 14.09.2016
comment
Terima kasih @Justin... Saat Anda mengatakan menyediakan beberapa mekanisme untuk membuat ketergantungan secara dinamis, apakah yang Anda maksud adalah Unity (Wadah IoC - hal berikutnya yang saya coba pahami lebih baik) - person Craig; 15.09.2016
comment
@Craig - Benar (karena itulah saya menyebutkan Kerangka Injeksi Ketergantungan). Persatuan hanyalah salah satunya. Saya juga suka Autofac dan nInject. - person Justin Niessner; 15.09.2016
comment
Setiap kali Anda menggunakan kata kunci baru di konstruktor, kata kunci tersebut akan memperkenalkan penggabungan yang erat, - person loneshark99; 15.09.2016