Mekanisme injektor properti IronPython untuk ASP.NET dapat membuat sintaks beberapa kode menjadi sederhana (untuk detailnya, silakan merujuk ke artikel saya), tetapi dukungan default tampaknya belum lengkap.
Saya mendekompilasi Microsoft.Web.IronPython.dll dan menambahkan dukungan injeksi properti untuk RepeaterItem dan Session (HttpSessionState).
Dukungan untuk RepeaterItem sangat sederhana, karena sudah memiliki ControlAttributesInjector. Jadi tambahkan saja sebaris kode ke konstruktor statis DynamicLanguageHttpModule.cs:
// item pengulang.
Ops.RegisterAttributesInjectorForType(typeof(RepeaterItem), ControlAttributesInjector() baru, false);
Sesi tidak begitu beruntung. Kelas ini mengimplementasikan ICollection, tetapi tidak mengimplementasikan antarmuka IDictionary. Jadi saya tidak bisa menggunakan DictionaryAttributesInjector. Tidak mungkin, saya sendiri yang menambahkan kelas SessionAttributesInjector. Kodenya adalah sebagai berikut:
menggunakan IronPython.Runtime;
menggunakan Sistem;
menggunakan Sistem.Koleksi;
menggunakan System.Runtime.InteropServices;
menggunakan Sistem.Web.SessionState;
menggunakan System.Diagnostics;
namespace Microsoft.Web.IronPython.AttributesInjectors {
// ditambahkan oleh Neil Chen.
kelas internal SessionAttributesInjector: IAttributesInjector {
Daftar IAttributesInjector.GetAttrNames(objek objek) {
Sesi HttpSessionState = objek sebagai HttpSessionState;
Daftar daftar = Daftar baru();
foreach (kunci string dalam sesi.Kunci) {
daftar.Tambahkan(kunci);
}
daftar pengembalian;
}
bool IAttributesInjector.TryGetAttr(objek objek, SimbolId namaSimbol, nilai objek keluar) {
Sesi HttpSessionState = objek sebagai HttpSessionState;
nilai = sesi[namaSimbol.GetString()];
kembali benar;
}
}
}
Terlampir adalah Microsoft.Web.IronPython.dll saya yang telah dimodifikasi.
Perlu dicatat bahwa injektor atribut hanya berguna untuk operasi get, seperti
name = Session.Name OK,
tetapi pengaturannya tidak:
Session.Name = 'some name' akan melaporkan kesalahan.
Anda masih perlu menggunakan sintaks ini:
Sesi["Nama"] = 'beberapa nama'