Имам клас в моето приложение Prism/CAL, който генерира формуляр за потребителите да попълват данни.
Формулярът се определя от XML файл по следния начин:
<area idCode="general" title="General">
<column>
<group title="Customer Data">
<field idCode="title" requiredStatus="true">
<label>title</label>
<fieldType>Title</fieldType>
</field>
<field idCode="firstName" requiredStatus="true">
<label>First Name</label>
<fieldType>Text</fieldType>
</field>
<field idCode="lastName" requiredStatus="true">
<label>Last Name</label>
<fieldType>Text</fieldType>
</field>
<field idCode="email" requiredStatus="true">
<label>E-Mail</label>
<fieldType>Email</fieldType>
</field>
...
</group>
</column>
</area>
формулярът трябва да зареди специфични контроли, които съответстват на всеки тип поле в XML, напр.
- Заглавие (показва падащо меню: г-н, г-жа, д-р и т.н.)
- Текст (просто текстово поле)
- Имейл (текстово поле с потвърждение на имейл)
- Пощенски код (текстово поле с потвърждение на пощенския код)
Искам да направя всеки контрол отделен модул, който се зарежда, така че напр. модулът ZipCode ще съществува в директория Modules като файл:
ZipCode.dll
което е просто просто текстово поле контрола, която валидира въз основа на пощенски код, но разработчиците могат да направят друга контрола, наречена:
ZipCodePlus.dll
който наследява същия интерфейс, но предоставя изскачащ гео-земен селектор за пощенски кодове. Веднага след като клиент замени ZipCode.dll с ZipCodePlus.dll, всички негови формуляри ще имат тази нова функционалност за търсене на пощенски кодове.
Имам обаче проблеми с визуализирането на това как това ще бъде технически изпълнено, тъй като тъй като класът ми на формуляр анализира XML, той инстанцира класовете, които предоставят функционалността за контролите, но за да инстанцира клас, трябва да имам препратка към него:
SmartFormFieldZipCodePresenter smartFormFieldEmailPresenter
= container.Resolve<SmartFormFieldEmailPresenter>();
Но как мога да го инстанцирам динамично, т.е. с името на класа като низ, и ако този клас не съществува, тогава той ще хвърли подходящо изключение , напр. нещо като това:
ПСЕВДО-КОД:
try {
var smartFormFieldZipCodePresenter
= container.Resolve("smartFormFieldZipCodePresenter");
}
catch (ModuleDoesNotExistException) {
...
}