Я уже рассказывал о типах данных (data types) - одной из главных концепций в C1.
До сих пор мы рассматривали т.н. "динамические" типы данных. Обычно вы их создаете в админке и там же наполняете данными, т.е. создаете элементы такого типа.
Система сама создает нужный интерфейс-тип, регистрирует его в \App_Data\Composite\Configuration\DynamicXmlDataProvider.config (не редактируйте этот файл вручную!), а данные этого типа хранит в соответствующем XML-файле в \App_Data\Composite\DataStores\ (если это сайт на основе XML) или в соответствующей таблице базы данных (если сайт на основе SQL).
Используя программный интерфейс С1 можно работать с такими типами данных в коде, т.е. получать, добавлять, изменять и удалять данные.
Однако вы можете создать свои типы данных программно - т.н. "статические". Это особенно полезно, если вы хотите типы данных (или их соответствия, напр, таблицы БД) из других приложений интегрировать в C1 и работать с ними прямо в С1 как с родными.
Сейчас я на простом пример покажу, как создать свой статический тип данных. Эта информация послужит отправной точкой для других примеров с использованием статических типов данных.
Статический тип данных реализуется путем создания интерфейса, который наследуется от интерфейса IData. У этого интерфейса должны быть определены некоторые атрибуты. Полям типа данных, включая невидимое в админке поле Id (идентификатор), в этом интерфейсе соответствуют свойства. Для свойств тоже должны быть определены свои атрибуты.
Создадим суперпростой тип данных (интерфейс) для хранения информации о продуктах - IProduct, с такими полями (свойствами): Id (идентификатор), Name (название), Description (описание), Date (дата).
В папке \App_Code, создадим файл IProduct.cs и наполним его таким кодом:
У интерфейса должны быть определены три обязательных атрибута:
Очень рекомендую почитать все руководство "Data types using C#" (англ.), описывающее как раз как создавать типы данных, используя C#.
До сих пор мы рассматривали т.н. "динамические" типы данных. Обычно вы их создаете в админке и там же наполняете данными, т.е. создаете элементы такого типа.
Система сама создает нужный интерфейс-тип, регистрирует его в \App_Data\Composite\Configuration\DynamicXmlDataProvider.config (не редактируйте этот файл вручную!), а данные этого типа хранит в соответствующем XML-файле в \App_Data\Composite\DataStores\ (если это сайт на основе XML) или в соответствующей таблице базы данных (если сайт на основе SQL).
Используя программный интерфейс С1 можно работать с такими типами данных в коде, т.е. получать, добавлять, изменять и удалять данные.
Однако вы можете создать свои типы данных программно - т.н. "статические". Это особенно полезно, если вы хотите типы данных (или их соответствия, напр, таблицы БД) из других приложений интегрировать в C1 и работать с ними прямо в С1 как с родными.
Сейчас я на простом пример покажу, как создать свой статический тип данных. Эта информация послужит отправной точкой для других примеров с использованием статических типов данных.
Статический тип данных реализуется путем создания интерфейса, который наследуется от интерфейса IData. У этого интерфейса должны быть определены некоторые атрибуты. Полям типа данных, включая невидимое в админке поле Id (идентификатор), в этом интерфейсе соответствуют свойства. Для свойств тоже должны быть определены свои атрибуты.
Создадим суперпростой тип данных (интерфейс) для хранения информации о продуктах - IProduct, с такими полями (свойствами): Id (идентификатор), Name (название), Description (описание), Date (дата).
В папке \App_Code, создадим файл IProduct.cs и наполним его таким кодом:
using System;
using Composite.Data;
using Composite.Data.Hierarchy;
using Composite.Data.Hierarchy.DataAncestorProviders;
namespace Samples
{
[AutoUpdateble]
[DataAncestorProvider(typeof(NoAncestorDataAncestorProvider))]
[KeyPropertyName("Id")]
[LabelPropertyName("Name")]
[DataScope(DataScopeIdentifier.PublicName)]
[ImmutableTypeId("{B51EE692-8360-4F6A-B0B9-E16A7E74EEBE}")]
public interface IProduct : IData
{
[StoreFieldType(PhysicalStoreFieldType.Guid)]
[ImmutableFieldId("{F3E6F73F-B2A4-48FA-9D7B-D0D2A578C2EB}")]
Guid Id { get; set; }
[StoreFieldType(PhysicalStoreFieldType.String, 64)]
[ImmutableFieldId("{31F38EC0-EA21-4E7F-82E8-6BAD22AADBA6}")]
string Name { get; set; }
[StoreFieldType(PhysicalStoreFieldType.String, 1042)]
[ImmutableFieldId("{D51790D7-1B04-4B0E-B19F-9F23E73DE645}")]
string Description { get; set; }
[StoreFieldType(PhysicalStoreFieldType.DateTime)]
[ImmutableFieldId("{73AD86A2-C91D-42FB-9FD4-C40899AF9558}")]
DateTime Date { get; set; }
}
}
using Composite.Data;
using Composite.Data.Hierarchy;
using Composite.Data.Hierarchy.DataAncestorProviders;
namespace Samples
{
[AutoUpdateble]
[DataAncestorProvider(typeof(NoAncestorDataAncestorProvider))]
[KeyPropertyName("Id")]
[LabelPropertyName("Name")]
[DataScope(DataScopeIdentifier.PublicName)]
[ImmutableTypeId("{B51EE692-8360-4F6A-B0B9-E16A7E74EEBE}")]
public interface IProduct : IData
{
[StoreFieldType(PhysicalStoreFieldType.Guid)]
[ImmutableFieldId("{F3E6F73F-B2A4-48FA-9D7B-D0D2A578C2EB}")]
Guid Id { get; set; }
[StoreFieldType(PhysicalStoreFieldType.String, 64)]
[ImmutableFieldId("{31F38EC0-EA21-4E7F-82E8-6BAD22AADBA6}")]
string Name { get; set; }
[StoreFieldType(PhysicalStoreFieldType.String, 1042)]
[ImmutableFieldId("{D51790D7-1B04-4B0E-B19F-9F23E73DE645}")]
string Description { get; set; }
[StoreFieldType(PhysicalStoreFieldType.DateTime)]
[ImmutableFieldId("{73AD86A2-C91D-42FB-9FD4-C40899AF9558}")]
DateTime Date { get; set; }
}
}
- ImmutableTypeId: определяет уникальный идентификатор для этого типа
- KeyPropertyName: свойство, которое служит в качестве ключа в этом типе
- DataScope: "область", в которой должны существовать элементы этого типа. DataScopeIdentifier.PublicName используется (наш пример), если элементы этого типа не требуют публикации, в противном случае, необходим добавить это атрибут дважды, со значениями DataScopeIdentifier.PublicName и DataScopeIdentifier.AdministratedName.
Остальные атрибуты - необязательны, и вы их используете по необходимости. Например, атрибут LabelPropertyAttribute определяет какое свойство будет служить надписью (ярлыком) для элементов этого типа данных, а AutoUpdateble автоматически добавляет и обновляет этот тип в провайдер данных по умолчанию (default data provider) - без этого атрибута, это нужно будет делать вручную.
Подробнее об атрибутах интерфейса можно почитать здесь (англ.)
У свойств - следующие атрибуты обязательны:
- ImmutableFieldId: определяет уникальный идентификатор для этого свойства
- StoreFieldType: определяет тип этого свойства. В нашем примере, мы используем Guid, String, и DateTime.
Об атрибутах свойств можно почитать здесь (англ.).
Очень рекомендую почитать все руководство "Data types using C#" (англ.), описывающее как раз как создавать типы данных, используя C#.
Если вы создали такой тип данных, то вам нужно знать, что он не появится у вас в разделе "Данные" в админке.
Да, вы сможете работать с этим типом данных программно, но из админки - нет. А вот как сделать все-таки доступным такой тип данных в админке, я расскажу в одном из следующих сообщений.
Здесь нам как раз пригодятся знания по консольным приложениям в C1, освещенных в нескольких предыдущих сообщениях.
(продолжение следует...)
Комментариев нет:
Отправить комментарий