четверг, 14 июля 2011 г.

Статические типы данных (1): Создание

Я уже рассказывал о типах данных (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 и наполним его таким кодом:

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; }
  }
}

У интерфейса должны быть определены три обязательных атрибута:
  • 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, освещенных в нескольких предыдущих сообщениях.

(продолжение следует...)

Комментариев нет:

Отправить комментарий