Kompilasi IOC waktu

11

Adakah yang memulai proyek untuk melakukan IOC pada waktu kompilasi (mungkin menggunakan Roslyn atau Linq MethodInfo emit)?

Pengalaman saya dengan wadah IOC sejauh ini luar biasa, menunjukkan beberapa masalah kecil

  1. Banyak wadah IOC lambat untuk memulai, karena banyak logika resolusi terjadi di sini
  2. Seringkali sulit untuk memastikan bahwa resolusi dimungkinkan, karena kompilasi tidak lagi memastikan bahwa konstruktor dapat dipanggil
  3. Seringkali kontainer IOC menambahkan overhead kecil ke runtime (beberapa bahkan tidak kecil, seringkali yang start up dengan cepat berjalan lambat)

Tampaknya bagi saya bahwa solusi yang ideal adalah menambahkan langkah kompilasi ke rantai build yang menambahkan kelas Factory, bukan IOC.

Adakah yang pernah melakukan ini sebelumnya? Jika tidak, mengapa tidak?

ArT
sumber

Jawaban:

4

Melakukan ini seharusnya tidak menjadi masalah. Jalankan saja logika IoC yang sama dan alih-alih instantiating kelas, Anda memancarkan kode yang melakukan instantiating.

Tetapi dengan melakukan ini, Anda menghilangkan satu keuntungan besar dari IoC: Kemampuan untuk mengubah bagaimana kronon disusun tanpa harus mengkompilasi ulang seluruh aplikasi. Hanya dengan mengganti konfigurasi, Anda dapat meminta aplikasi menggunakan berbagai layanan atau sumber data. Dan sementara saya belum melihat aplikasi yang akan memanfaatkan sepenuhnya kemampuan ini, itu masih merupakan bagian utama dari kesuksesan IoC.

Euforia
sumber
Ya saya tahu itu mungkin. Tapi saya belum melihat wadah IoC yang melakukannya. Saya juga mencatat bahwa tren saat ini tampaknya mengarah pada pendaftaran kode (API lancar). Mengingat itu, saya sedang mempertimbangkan untuk menulis wadah IoC.
ArTs
Sepertinya saya ingat Hiro ( github.com/philiplaureano/Hiro ) mungkin melakukan tugasnya pada waktu kompilasi.
lzcd
2
"Tetapi dengan melakukan ini, kamu menghilangkan satu keuntungan besar dari IoC: Kemampuan untuk mengubah bagaimana para penekan dikomposisikan tanpa harus mengkompilasi ulang seluruh aplikasi." Tampaknya bagi saya bahwa menerapkan ini ke seluruh aplikasi adalah berlebihan; Anda mengubah setiap bagian aplikasi menjadi plug-in. Selain itu, kedua teknik harus dapat hidup berdampingan - tidak ada alasan Anda tidak dapat mentransfer beberapa komponen pada waktu kompilasi dan beberapa saat runtime.
Doval
Saya tidak melihat bagaimana itu keuntungan besar. Dalam konteks apa Anda benar-benar mengganti komponen saat runtime? Beberapa kasus penggunaan konfigurasi mungkin?
andyczerwonka
4

Dagger untuk Java / Android melakukan itu. Ini mengorbankan beberapa sihir runtime (seperti Guice's) untuk menawarkan pengalaman codegen waktu kompilasi yang hampir sepenuhnya, termasuk mengubah sebagian besar kesalahan runtime menjadi kesalahan kompilasi.

Akan keren juga. NET.

orip
sumber