จาก Castle Active Record ทั้ง สอง ตอน ทำให้มานึกๆเอาแล้วก็สงสัยว่า ตอนที่ Initialize ตัว ActiveRecord ทำไมต้องมาใส่ข้อมูลของ Type ที่เราจะใช้ด้วยทั้งๆที่่เราก็ระบุ Attribute ActiveRecord ให้กับคลาสอยู่แล้ว ตอนนั้นก็เลยคิดขึ้นมาได้ว่าถ้าใช้ Reflection เข้ามาช่วยก็น่าจะใช้ได้นี่
Assembly a = Assembly.GetExecutingAssembly();
Type[] allTypes = a.GetTypes();
List<Type> selectedType = new List<Type>();
foreach (Type t in allTypes)
{
if (t.GetCustomAttributes(typeof(ActiveRecordAttribute), false) != null)
{
selectedType.Add(t);
}
}
ActiveRecordStarter.Initialize(source, selectedType.ToArray());
คือตอนแรกเราก็จัดการดึง Type ทั้งหมดที่อยู่ใน Assembly ขึ้นมาก่อน แล้วก็เลือกเฉาพะที่แปะ Attribute ActiveRecord ขึ้นมาแล้วก็ส่งไปตอน initilize ก็เรียบร้อย
แต่ อ้ะๆๆๆ ยังก่อน
ถ้าเราดูโอเวอร์โหลดของ ActiveRecordStarter.Initialize เราก็จะเห็นว่ามันมีโอเวอร์โหลดที่รับ assembly เข้าไปเหมือนกันดังนั้นก็เลยแก้เป็น
ActiveRecordStarter.Initialize(Assembly.GetExecutingAssembly(), source);
ง่ายกว่าแยะเลยแฮะ
ยังไงก็ตาม ถ้าเกิดมี type เป็นจำนวนมากแถมส่วนใหญ่ก็ไม่ใช่ type ของ activerecord ล่ะก็ ใส่เพิ่มเองแบบเดิมหรือไม่ก็แยก type เหล่านั้นออกไป assembly อื่น น่าจะให้ผลลัพธ์ที่ดีกว่านะ
