Статьи

Telerik Data Access Enhancer – постоянство и отслеживание изменений без отражения

Первоначально Написано Кристианом Николовым

В этом посте я расскажу об Enhancer — неотъемлемой части Telerik Data Access, которая часто остается незамеченной. Enhancer — это инструмент, который позволяет вам использовать простые классы POCO в ваших моделях доступа к данным Telerik и, следовательно, упрощает процесс разработки. Давайте посмотрим, что этот инструмент делает для нас.

Что такое Enhancer и зачем он нужен?

Enhancer — это инструмент, который делает классы вашей модели постоянными , добавляет автоматическое отслеживание изменений и ленивую логику загрузки . Все это делается автоматически и без каких-либо размышлений!  Это сокращает время разработки, поскольку вам не нужно добавлять какую-либо конкретную логику в классы самостоятельно, а отсутствие рефлексии обеспечивает оптимальную производительность . Enhancer вызывается как шаг после сборки, чтобы внедрить код, необходимый для облегчения вышеупомянутой функциональности в постоянных классах модели. Чтобы проиллюстрировать это, рассмотрим код очень простого класса User, который является частью модели доступа к данным Telerik:

public partial class User
{
    private int _userId;
    public virtual int UserId
    {
        get
        {
            return this._userId;
        }
        set
        {
            this._userId = value;
        }
    }
        
    private string _userName;
    public virtual string UserName
    {
        get
        {
            return this._userName;
        }
        set
        {
            this._userName = value;
        }
    }
        
    private string _password;
    public virtual string Password
    {
        get
        {
            return this._password;
        }
        set
        {
            this._password = value;
        }
    }
}

Как видите, этот постоянный класс ничем не отличается от любого класса POCO. Давайте рассмотрим, что будет с этим классом после того, как мы
построим проект, содержащий модель. Открытие полученной сборки с помощью
Telerik Just Decompile покажет, что класс User теперь имеет следующий код:

public class User : PersistenceCapable
{
    private int _userId;

    private string _userName;

    private string _password;

    public virtual string Password
    {
        get
        {
            return User.OpenAccessEnhancedGet_password(this);
        }
        set
        {
            User.OpenAccessEnhancedSet_password(this, value);
        }
    }

    public virtual int UserId
    {
        get
        {
            return User.OpenAccessEnhancedGet_userId(this);
        }
        set
        {
            User.OpenAccessEnhancedSet_userId(this, value);
        }
    }

    public virtual string UserName
    {
        get
        {
            return User.OpenAccessEnhancedGet_userName(this);
        }
        set
        {
            User.OpenAccessEnhancedSet_userName(this, value);
        }
    }

    public User()
    {
    }
}

Есть несколько ключевых отличий. Класс User теперь реализует интерфейс PersistenceCapable , кроме того, был изменен код в методах получения и установки свойств. Вы можете заметить, что методы, вызываемые в методах получения и установки для свойств, отсутствуют в декомпилированном коде. Это потому, что вы видите только часть введенного кода — есть ряд дополнительных элементов, которые не отображаются по умолчанию. Чтобы раскрыть полный код, вам нужно включить опцию Показать сгенерированные компилятором типы и элементы в Just Decompile. Все эти изменения делают класс постоянным , позволяющим Telerik Data Accessавтоматически отслеживать изменения, которые происходят в нем и облегчают ленивую загрузку . По сути, класс User был улучшен, так что среда Telerik Data Access Runtime может работать с ним.

Как Enhancer интегрирован в проект?

Вызов Enhancer в качестве шага пост-сборки необходим только для проектов, которые содержат модель доступа к данным Telerik. В таких проектах Enhancer интегрируется путем импорта файла OpenAccess.targets в .csproj или .vbproj . Импорт автоматически добавляется в сценарий MSBuild, содержащийся в файле .csproj или .vbproj, когда в проект добавляется модель домена или модель Fluent . Обратите внимание, что импорт добавляется после после файла для файла .targets соответствующего языка программирования (в данном случае C #):

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Condition="Exists('$(MSBuildExtensionsPath)\OpenAccess.targets')" Project="$(MSBuildExtensionsPath)\OpenAccess.targets" />

Импортированный файл OpenAccess.targets находится в каталоге MSBuild, обозначенном MSBuildExtensionsPath . При этом вы можете сделать локальную копию файла .targets и изменить путь для его импорта, если этого требует ваш сценарий. Кроме того, вы даже можете скопировать сам Enhancer локально и загрузить локальную копию из файла .targets. Этот же подход используется в нашем Telerik.Data.Access.Fluent пакете NuGet .

Файл OpenAccess.targets проверяет возможность выполнения процесса расширения и вызывает Enhancer для этого. Он также определяет настройки по умолчанию, которые управляют поведением Enhancer:

<PropertyGroup>
    <UseXmlMapping Condition="'$(UseXmlMapping)'==''">true</UseXmlMapping>
    <UseAttributeMapping Condition="'$(UseAttributeMapping)'==''">true</UseAttributeMapping>
    <UseFluentMapping Condition="'$(UseFluentMapping)'==''">true</UseFluentMapping>
    <OpenAccessPath Condition="'$(OpenAccessPath)'==''">C:\Program Files\Telerik\Data Access\</OpenAccessPath>
    <EnhancerAssembly Condition="'$(EnhancerAssembly)'==''">$(OpenAccessPath)\sdk\enhancer.exe</EnhancerAssembly>
    <EnhancerVerboseMode Condition="'$(EnhancerVerboseMode)'==''">3</EnhancerVerboseMode>
    <Use64BitEnhancer Condition="'$(Use64BitEnhancer)'=='' And '$(PlatformTarget)'=='x64'">true</Use64BitEnhancer>
    <ValidateMapping Condition="'$(ValidateMapping)'==''">false</ValidateMapping>
</PropertyGroup>

Эти настройки по умолчанию можно настроить в соответствии с вашими потребностями непосредственно в .csproj или .vbproj, который импортирует файл OpenAccess.targets. Таким образом, вы можете изменять поведение Enhancer только для текущего проекта, не меняя его глобально. Например, следующий скрипт MSBuild, помещенный перед импортом файла OpenAccess.targets, установит для Verbose Mode Enhancer значение 2 (в отличие от 3, что является значением по умолчанию), чтобы в окне «Вывод» отображались только ошибки:

<PropertyGroup>
    <EnhancerVerboseMode Condition="'$(EnhancerVerboseMode)'==''">2</EnhancerVerboseMode>
</PropertyGroup>

Для получения дополнительной информации о настройках, определенных файлом OpenAccess.targets, вы можете обратиться к нашей документации об этом .

Enhancer является одним из наиболее важных аспектов Telerik Data Access, так как он является одним из ключевых элементов для быстрой и простой разработки уровня доступа к данным. Понимание его функций может помочь вам изменить среду разработки или поведение Enhancer для данного проекта в соответствии с потенциальными конкретными требованиями.