Используемая в примерах диаграмма:
Класс данных
Все классы данных наследуются от базового DataObject, обеспечивающего основные манипуляции:
- статусы,
- хранение данных,
- хранение копии данных для вычисления изменённых атрибутов,
- означивание и хранение первичного ключа.
public class SimpleDataObject:DataObject
{
public SimpleDataObject()
{
}
}
Атрибут
Атрибуты UML-класса прописываются в класс данных приватным членом указанного типа с именем атрибута и соответствующим свойством для получения/установки значения. Свойство всегда виртуальное, но с любым модификатором.
public class SimpleDataObject:DataObject
{
public SimpleDataObject()
{
}
private string fName;
private int fIntAttr;
public virtual string Name {get{return fName;} set{fName=value;}}
public virtual int IntAttr {get{return fIntAttr;} set{fIntAttr=value;}}
}
Мастер
Мастеровая ассоциация представлена в классе данных членом соответствующего типа – мастерового класса данных, и аналогичным свойством, объявленным как virtual. Пример:
private MasterDataObject fMaster;
public virtual MasterDataObject Master {get{return fMaster;} set{fMaster=value;}}
Детейл
Если класс является агрегируемым, то:
1.Генерируется свойство, указывающее агрегатор(шапку). Это свойство помечается атрибутом ICSSoft.STORMNET.DataObject.AgregatorAttribute.
Пример класса данных детейла:
public class DetailDataObject:DataObject
{
public DetailDataObject()
{
}
private string fStringAttr;
public virtual string StringAttr {get{return fStringAttr;} set{fStringAttr=value;}}
private SimpleDataObject fSimple;
[Agregator]
public virtual SimpleDataObject Simple {get{return fSimple;}set{fSimple=value;}}
}
2.Создаётся класс, производный от DetailArray
, обеспечивающего базовые операции над массивом объектов данных агрегируемого класса. Вводятся операции получения объекта данных по ключу и по индексу, а также добавления объекта. Делается это для того, чтобы обеспечить доступ к массиву по индексу и добавление объекта.
Пример класса массива объектов данных для данного класса данных:
public class DetailArrayOfDetailDataObject:DetailArray
{
public DetailArrayOfDetailDataObject(SimpleDataObject simpledataobject):base(typeof(DetailDataObject), simpledataobject)
{
}
public DetailDataObject this[object key] {get {return (DetailDataObject) GetByKey(key);} set {SetByKey(key,value);}}
public DetailDataObject this[int index]
{
get
{
return (DetailDataObject) ItemByIndex(index);
}
}
public void Add(DataObject dataobject)
{
AddObject(dataobject);
}
}
3.Если класс является агрегирующим, то детейловая ассоциация представляется в объекте данных членом соответствующего типа-класса, производного от DetailArray
и аналогичным свойством.
Пример:
private DetailArrayOfDetailDataObject fDetails;
public virtual DetailArrayOfDetailDataObject Details {get{return fDetails;} set{fDetails=value;}}
Также пример доступен [по адресу] (https://github.com/Flexberry/FlexberryORM-DemoApp/tree/master/FlexberryORM/CDLIB/Objects).
Наследование
Если класс является унаследованным, то в исходном коде он наследуется от соответствующего предка (в соответствии с диаграммой). Если у унаследованного класса есть атрибут (детейл, мастер) с тем же именем, что и у предка, он перегружается. При этом не может меняться тип. Операции UML-класса генерируются виртуальными методами .Net-класса. Методы также могут быть перегружены в наследниках, для чего у наследника должен быть указан метод с аналогичным числом и типом параметров.