Простейшим способом обеспечить поддержку Динамических Реквизитов в бизнес-классе является наследование от базовых сущностей, которые уже реализуют такую возможность.
using DevExpress.ExpressApp;
using DevExpress.Xpo;
using Xafari.BC.Xpo;
namespace Xafari.FeatureCenter.DynamicProperties
{
public class DynamicParametersObject : PersistentXafariBaseObject
{
public DynamicParametersObject(Session session) : base(session) { }
private string _name;
public string Name
{
get { return _name; }
set { SetPropertyValue("Name", ref _name, value); }
}
}
}
В общем случае, следует реализовать интерфейс IInstancePropertiesSupport.
Вышеприведенная диаграмма классов реализована для XPO и Domain Components, в том и другом случаях имеются персистентные и не персистентные реализации.
Xafari.BC.Xpo Module |
Xafari.BC.DC Module |
|
IInstancePropertiesSupport |
XafariBaseObject (abstract) |
DynamicObjectBase |
NonPersistentXafariBaseObject |
PersistentDynamicObject |
|
PersistentXafariBaseObject |
XafariObject |
|
IInstanceProperty |
InstancePropertyBase (abstract) |
DynamicPropertyBase |
XpoNonPersistentDynamicProperty |
PersistentDynamicProperty |
|
XpoPersistentDynamicProperty |
Обращаться к динамическим свойствам через интерфейс IInstancePropertiesSupport.
Работа с DynamicPropertiesObject
Xafari.BC.DynamicProperties.DynamicPropertiesObject предоставляет основные возможности для работы с Динамическими Реквизитами. Когда требуется некий специальный не персистентный класс с динамическим набором свойств, то удобнее всего использовать его.
Методы CreateObject и CreateObject<T>
В этих методах необходимо уделить внимание необязательному параметру key типа System.Object. Дело в том, что модификация коллекции DynamicPropertiesList или модификация полей Type и(или) Name элементов этой коллекции влечет перегенерацию DynamicPropertiesObject. Поэтому, по умолчанию, при генерации объектов DynamicPropertiesObject на основании коллекции свойств вычисляется специальный ключ. Таким образом, фреймворк может решить, требуется ли перегенерация DynamicPropertiesObject или можно воспользоваться существующим экземпляром. Объект будет сгенерирован заново в следующих случаях:
- изменилось количество элементов коллекции DynamicPropertiesList;
- изменилось поле Name и(или) Type у одного или нескольких элементов коллекции DynamicPropertiesList;
- в метод CreateObject или CreateObject<T> в качестве параметра key передали значение, отличное от null;
- объект DynamicPropertiesObject с таким ключом уже существует в словаре.
Метод CreateDetailView
Метод возвращает Detail View для экземпляра DynamicPropertiesObject. Используется в редакторах Xafari для отображения списка Динамических Реквизитов. Параметр modelHandler типа Action<IModelDetailView> позволяет подробно настроить отображение Динамических Реквизитов.