Особенности реализации сервиса данных

В общем случае сервис данных должен реализовывать интерфейс ICSSoft.STORMNET.Business.IDataService.

Реализация произвольного сервиса данных

Если необходимо реализовать собственный сервис данных, следует учитывать следующее:

  1. Необходимо учитывать атрибуты хранения. Установку этих атрибутов можно проверить методами Information: GetAssemblyStorageName, GetClassStorageName, GetPropertyStorageName.
  2. Классы, атрибуты, мастера, детейлы могут быть нехранимыми, что указывается NotStoredAttribute. Метод Information.GetStorablePropertyNames возвращает список хранимых атрибутов.
  3. Сначала всё вычитывается в соответствии с порядком, указанным атрибутом LoadingOrderAttribute, затем, всё остальное. Метод Information.GetLoadingOrder возвращает порядок.
  4. В атрибутах, мастерах могут не допускаться пустые значения, что указывается атрибутом NotNullAttribute.

С целью оптимизации, нужно обновлять только изменённые атрибуты Information.GetAlteredProperyNames.

Реализация сервиса данных для реляционного хранилища

Если требуется реализовать сервис данных для реляционного хранилища, рекомендуется унаследоваться от готовых сервисов данных Flexberry Platform, в частности, от общего предка реляционных сервис данных SQLDataService, либо ODBCDataService. Затем, согласно особенностей хранилища, которое планируется использовать, необходимо соответствующим образом перегрузить методы.

Ниже приводится пример сервиса данных, выполняющего работу с Microsoft SQL Server напрямую, через SQLClient:

public class MSSQLDataService:ICSSoft.STORMNET.Business.SQLDataService
{
    public override System.Data.IDbConnection GetConnection()
    {
        return new System.Data.SqlClient.SqlConnection(this.CustomizationString);
    }

    public override string GetIfNullExpression(params string[] identifiers)
    {
        string result = identifiers[identifiers.Length-1];
        for (int i= identifiers.Length-2;i>=0;i--)
        result = string.Concat("ISNULL(",identifiers[i],", ",result,")");
        return result;
    } 
}

В этом примере переопределены всего два метода: один теперь выполняет подсоединение к источнику напрямую, другой учитывает специфику указания в запросы функции ISNULL.