Пошаговое руководство. Использование службы домена в приложении ASP.NET

Служба домена позволяет инкапсулировать модель данных и делать ее доступной на уровне бизнес-логики, чтобы отделить приложение от уровня доступа к данным. У использования уровня бизнес-логики есть множество преимуществ, например разделение областей ответственности и перемещение логики работы с данными за пределы уровня представления.

Элемент управления DomainSourceControl позволяет создать приложение ASP.NET, которое будет использовать службу домена для выполнения операций создания, чтения, обновления и удаления (CRUD). Служба домена реализует уровень бизнес-логики, использующий модель данных. В качестве модели данных может использоваться Entity Framework, LINQ to SQL или какая-либо другая модель объектно-реляционного сопоставления. Элемент управления DomainSourceControl отличается от других элементов управления данными ASP.NET, которые напрямую обращаются к базе данных (например, SqlDataSource), или элементов управления, которые напрямую обращаются к модели данных (например, EntityDataSource и LinqDataSource), поскольку элемент управления DomainSourceControl не обращается к базе данных или модели данных напрямую. Элемент управления ObjectDataSource также позволяет отделить уровень представления от бизнес-логики. Однако элемент управления DomainSourceControl имеет следующие преимущества по сравнению с элементом управления ObjectDataSource.

  1. Он использует уровень бизнес-логики служб RIA WCF. (Дополнительные сведения см. в разделе WCF RIA Services на веб-сайте Silverlight.)

  2. Он полностью поддерживает LINQ.

  3. Он поддерживает проверку с использованием элемента управления DomainValidator.

  4. Он интегрируется с поставщиком членства ASP.NET для реализации функций проверки подлинности и авторизации. Методы службы можно снабдить атрибутами RequiresAuthenticationAttribute и RequiresRolesAttribute.

ПримечаниеПримечание

Дополнительные сведения об использовании элемента управления DomainDataSource для Silverlight см. в разделе DomainDataSource.

В этом пошаговом руководстве описано, как с помощью элемента управления DomainDataSource обращаться к базе данных с веб-страницы ASP.NET. Пример проекта Visual Studio для этого пошагового руководства можно загрузить на следующей странице: Download Sample. А на странице Microsoft ASP.NET 4.0 Data Access: Patterns for Success with Web Forms можно посмотреть видеодемонстрацию использования элемента управления DomainDataService.

Это пошаговое руководство содержит следующие процедуры.

Для выполнения этого пошагового руководства потребуется следующее.

Для использования службы домена необходимо создать проект веб-приложения ASP.NET, включающий базу данных и модель данных. Будет создана модель, содержащая объекты базы данных в виде типов среды CLR. Эти типы используются службой домена для взаимодействия с базой данных. Можно использовать модель LINQ to SQL или ADO.NET Entity Framework.

Чтобы создать веб-приложение ASP.NET, выполните следующие действия:

  1. В меню Файл Visual Studio выберите пункт Создать проект.

    Откроется диалоговое окно Новый проект.

  2. В разделе Установленные шаблоны разверните узел Visual C# или Visual Basic и выберите узел Веб.

  3. В списке шаблонов выберите шаблон Пустое веб-приложение ASP.NET.

  4. Присвойте проекту имя использование_службы_домена, укажите расположение и нажмите кнопку ОК.

  5. Постройте приложение.

Ниже показано, как добавить в приложение базу данных AdventureWorksLT.

Добавление базы данных к веб-приложению

  1. В обозревателе решений щелкните правой кнопкой мыши имя проекта, выберите команду Добавить, щелкните Добавить папку "ASP.NET", после чего щелкните App_Data.

    В проект будет добавлена папка App_Data.

  2. Щелкните правой кнопкой мыши папку App_Data, выберите команду Добавить и щелкните Существующий элемент.

    Откроется диалоговое окно Добавление существующего элемента.

  3. Укажите расположение файла базы данных AdventureWorksLT (AdventureWorksLT_Data.mdf). Этот файл базы данных входит в пример проекта, который можно загрузить для этого пошагового руководства (загрузить).

  4. Нажмите кнопку Добавить.

    В проекте будет создана копия файла базы данных.

Ниже показано, как создать модель данных, содержащую классы, которые представляют таблицы базы данных. В этом пошаговом руководстве будет использоваться модель данных ADO.NET Entity Framework. Однако вместо нее можно использовать и модель данных LINQ-to-SQL.

Создание модели данных

  1. В обозревателе решений щелкните правой кнопкой мыши имя проекта, выберите команду Добавить и щелкните Новый элемент.

    Откроется диалоговое окно Добавление нового элемента.

  2. В разделе Установленные шаблоны выберите элемент Данные.

  3. В списке шаблонов выберите ADO.NET Entity Data Model.

  4. Назовите модель базы данных AdventureWorksLT.edmx и нажмите кнопку Добавить.

    Откроется Мастер моделей EDM.

  5. На странице Выбор содержимого модели выберите вариант Создать из базы данных.

  6. Нажмите кнопку Далее.

  7. На странице Выбор подключения базы данных в списке Какое подключение ваше приложение должно использовать для работы с базой данных? выберите файл AdventureWorksLT_Data.mdf.

  8. Убедитесь, что установлен флажок Сохранить настройки подключения сущности в Web.config как. Можно оставить имя строки подключения, используемое по умолчанию.

  9. Нажмите кнопку Далее.

    Мастер отображает страницу, где можно указать, какие объекты базы данных нужно включить в модель.

  10. На странице Выбор объектов базы данных разверните узел Таблицы и выберите таблицы Product, ProductCategory и ProductModel, как показано на следующем рисунке.

    Выбор объектов базы данных
  11. Убедитесь, что установлен флажок Включить столбцы внешнего ключа в модель. Можно оставить заданное по умолчанию пространство имен модели.

  12. Нажмите кнопку Готово.

    Откроется конструктор модели EDM ADO.NET. Вы создали модель данных, представляющую базу данных AdventureWorksLT.

  13. Закройте конструктор.

  14. Постройте приложение.

    В результате построения класс контекста AdventureWorksLT_DataEntities станет доступным службе домена для следующей процедуры.

Ниже описана процедура использования службы домена служб RIA WCF в приложении ASP.NET. Она состоит из следующих шагов:

  • добавление класса службы домена в проект. При этом будет создан класс, позволяющий приложению выполнять в базе данных операции CRUD, а также включать собственную бизнес-логику. Этот класс работает на промежуточном уровне;

  • создание бизнес-логики. При этом код (бизнес-логика) помещается в класс службы домена;

  • объявление элемента управления DomainDataSource. Это действие выполняется в разметке страницы, чтобы пользователь мог взаимодействовать с базой данных. Этот элемент управления работает на клиентском уровне или на уровне представления.

Добавление класса службы домена в проект

  1. В обозревателе решений щелкните правой кнопкой мыши имя проекта, выберите команду Добавить и щелкните Новый элемент.

  2. В разделе Установленные шаблоны выберите пункт Веб.

  3. В списке шаблонов выберите Класс службы домена.

  4. Присвойте файлу имя AdventureWorksDomainService и нажмите кнопку Добавить.

    Откроется диалоговое окно Добавление нового класса службы домена. Поле Имя класса службы домена будет содержать указанное на предыдущем шаге имя AdventureWorksDomainService.

  5. Снимите флажок Включить клиентский доступ и убедитесь, что флажок Предоставить доступ к конечной точке OData также снят. (Эти параметры используются только при построении приложения служб RIA для клиента Silverlight.)

  6. В списке Доступные классы DataContexts/ObjectContexts выберите значение AdventureWorksLT_DataEntities (Entity Framework). Если этот список пуст, решение, возможно, не было построено. Закройте диалоговое окно Добавление нового класса службы домена, выполните построение приложения и повторите описанные шаги.

  7. В списке Сущности выберите таблицы Product, ProductCategory и ProductModel. Для таблицы Product установите флажок Разрешить изменение.

  8. Убедитесь, что установлен флажок Создавать связанные классы для метаданных. Благодаря этому будет создан файл AdventureWorksDomainService.metadata, который будет использоваться для добавления атрибутов проверки.

    На следующем рисунке показано диалоговое окно Добавление нового класса службы домена, в котором выбраны необходимые параметры.

    Добавление нового класса службы домена
  9. Нажмите кнопку ОК.

    Будут созданы класс AdventureWorksDomainService и соответствующие метаданные. Этот класс содержит методы для операций CRUD в базе данных. Класс и файлы метаданных можно изменить, чтобы включить в них бизнес-логику. (В следующей процедуре будет показан соответствующий пример.) Обратите внимание, что ссылки проекта были обновлены и теперь содержат необходимые сборки, а файл Web.config теперь содержит все необходимые элементы конфигурации.

  10. В меню Файл выберите команду Сохранить все.

Ниже показано, как доработать класс AdventureWorksDomainService и соответствующие метаданные, включив в них бизнес-логику. Эта доработка очень проста, но она позволяет понять, какие изменения можно вносить.

Создание бизнес-логики

  1. В обозревателе решений откройте файл класса AdventureWorksDomainService.

  2. Измените метод UpdateProduct, включив в него логику проверки поля ListPrice, и обновите поле ModifiedDate, чтобы в нем содержалась текущая дата, как показано в следующем примере.

    public void UpdateProduct(Product currentProduct)
    {
      if ((currentProduct.EntityState == EntityState.Detached))
      {
        // Custom logic: set a lower limit for the price.
        if (currentProduct.ListPrice < 5)
          throw new ValidationException("The list price must be >= 5.");
        // Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today;
        this.ObjectContext.Products.AttachAsModified(currentProduct,
           this.ChangeSet.GetOriginal(currentProduct));
    
      }
    }
    

    Public Sub UpdateProduct(ByVal currentProduct As Product)
      If (currentProduct.EntityState = EntityState.Detached) Then
        ' Custom logic: set a lower limit for the price.
        If currentProduct.ListPrice < 5 Then
          Throw New ValidationException("The list price must be >= 5.")
        End If
        Me.ObjectContext.Products.AttachAsModified(currentProduct, _
          Me.ChangeSet.GetOriginal(currentProduct))
        ' Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today
      End If
    End Sub
    

    В случае сбоя проверки создается исключение, а на страницу передается сообщение об ошибке, которое отображается перед пользователем.

  3. Измените метод GetProducts, задав логику сортировки для правильной работы Entity Framework, как показано в следующем примере.

    public IQueryable<Product> GetProducts()
    {
      return this.ObjectContext.Products.OrderBy(p => p.ProductID);
    } 
    
    ПримечаниеПримечание

    В коде имеется несколько методов Get, которые задают параметры, порядок сортировки и другие условия запросов. Однако в нем может быть по одному методу Create, Update и Delete.

  4. Сохраните и закройте файл.

  5. В обозревателе решений откройте файл AdventureWorksDomainService.metadata.

  6. Добавьте атрибут Required в элемент поля данных Color, как показано в следующем фрагменте кода. Этот атрибут устанавливает требование, чтобы поле данных не было пустым (база данных допускает наличие пустых полей). Если пользователь не введет значение, возникнет ошибка.

    [Required(AllowEmptyStrings=false, ErrorMessage="Color is required")]
    public string Color{ get; set; }
    

    <Required(AllowEmptyStrings:=False, ErrorMessage:="Color is required")> _
    Public Property Color As String
    
  7. Сохраните и закройте файл метаданных.

  8. Постройте приложение.

Ниже показано, как добавить элемент управления DomainDataSource в разметку страницы, чтобы пользователь мог взаимодействовать с базой данных.

Добавление элемента управления DomainDataSource на веб-страницу ASP.NET

  1. В обозревателе решений щелкните правой кнопкой мыши имя проекта, выберите команду Добавить и щелкните Новый элемент.

  2. В группе Установленные шаблоны щелкните Веб.

  3. В списке шаблонов выберите элемент Форма Web Form.

  4. Присвойте файлу имя Default.aspx и нажмите кнопку Добавить.

  5. Откройте файл Default.aspx в представлении конструктора.

  6. Добавьте на страницу элемент управления DomainDataSource, расположенный на вкладке Общие на панели элементов.

    На элементе управления DomainDataSource будет отображаться меню Задачи DomainDataSource.

    Если элемент управления не отображается на панели элементов, выполните следующую процедуру.

    1. В меню Сервис выберите пункт Выбрать элементы панели элементов.

    2. В диалоговом окне Выбор элементов панели элементов перейдите на вкладку Компоненты .NET Framework.

    3. Установите флажок DomainDataSource и нажмите кнопку ОК.

  7. В меню Задачи DomainDataSource выберите команду Настроить источник данных.

    Откроется мастер Настройка источника данных.

  8. На странице Выбор службы домена в списке Тип службы домена выберите ранее созданный класс UsingDomainService.AdventureWorksDomainService, как показано на следующем рисунке.

    Выбор службы домена
  9. Нажмите кнопку Далее.

  10. В области Настройка доступа к данным выберите метод IQueryable<Product>GetProducts().

  11. Установите флажки Разрешить вставки, Разрешить обновления и Разрешить удаления.

    На следующем рисунке показана страница Настройка доступа к данным.

    Настройка доступа к данным
  12. Нажмите кнопку Готово.

  13. Добавьте на страницу элемент управления GridView с вкладки Данные на панели элементов.

  14. В меню Задачи GridView в списке Выбор источника данных выберите DomainDataSource1.

    Это идентификатор созданного ранее элемента управления DomainDataSource.

  15. В меню Задачи GridView щелкните Правка столбцов.

    На экране появится диалоговое окно Поля.

  16. Убедитесь, что флажок Автоматически создавать поля снят.

  17. В разделе Выбранные поля удалите все поля, кроме Name, Color, ListPrice и ModifiedDate.

  18. Нажмите кнопку ОК.

  19. При необходимости в меню Задачи GridView установите параметры, включающие разбиение по страницам, сортировку и выделение.

  20. Сохраните файл.

  21. Перейдите в представление Исходный код.

  22. Выберите элемент управления GridView.

  23. В окне Свойства установите для свойства DataKeyNames значение "ProductID, ProductNumber, SellStartDate" (т. е. список разделенных запятыми значений). ProductID — первичный ключ строки. ProductNumber и SellStartDate в модели EDM не могут принимать значение NULL, поэтому также должны быть включены.

  24. Присвойте свойству AutoGenerateEditButton значение True, чтобы можно было изменять и удалять строки таблицы.

  25. В представлении исходного кода замените элемент Columns следующей разметкой.

      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Delete" Text="Delete"
              ForeColor="#333333"  OnClientClick='return confirm("Are you sure you want to delete this row?");'/>
          </ItemTemplate>
        </asp:TemplateField>
    
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:TemplateField>
          <HeaderTemplate>Color</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("Color") %>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ColorID" runat="server" Text='<%# Bind("Color") %>'/>
            <cc1:DomainValidator ID="DomainValidator2"  runat="server" DataField="Color"/>
          </EditItemTemplate>
        </asp:TemplateField>
    
        <asp:TemplateField>
          <HeaderTemplate>ListPrice</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("ListPrice")%>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ListPriceID" runat="server" Text='<%# Bind("ListPrice") %>'/>
            <cc1:DomainValidator ID="DomainValidator3" runat="server" DataField="ListPrice"/>
           </EditItemTemplate>
         </asp:TemplateField>
    
         <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" />
      </Columns>
    

    Эта разметка определяет использование пользовательских шаблонов, позволяющих проверять значения полей данных Color и ListPrice перед их отправкой на сервер во время обратной передачи. Кроме того, она создает элемент управления LinkButtonDelete, включающий клиентский скрипт, который позволяет пользователям подтверждать, что они хотят удалить элемент, до фактического выполнения операции.

  26. Над разметкой элемента управления GridView вставьте следующую разметку, которая служит для вывода ошибок проверки.

    <asp:ValidationSummary ID="ValidationSummary1" runat="server" />
    <cc1:DomainValidator runat="server" ControlToValidate="GridView1"/>
    
  27. Сохраните файл Default.aspx.

  28. Постройте приложение.

Ниже показано, как тестировать функции службы домена с помощью элемента управления GridView. Описанная процедура проверяет выполнение следующих процессов:

  • взаимодействие с базой данных через пользовательскую бизнес-логику работает ожидаемым образом;

  • ASP.NET применяет изменения, сделанные пользователем, к полям базы данных;

  • ASP.NET выводит сообщения об ошибках, создаваемые пользовательской бизнес-логикой.

Тестирование службы домена

  1. В обозревателе решений щелкните правой кнопкой мыши страницу Default.aspx и выберите команду Просмотреть в обозревателе.

    В браузере будет отображена страница, содержащая таблицу Product.

  2. В любой строке щелкните Изменить и измените значение в столбце ListPrice на значение меньше 5, после чего щелкните Обновить.

    Появится пользовательское сообщение об ошибке, указывающее, что значение поля должно быть не меньше 5.

    Тестирование DDS
  3. В той же строке введите в столбец ListPrice значение больше 5 и щелкните Обновить.

    ASP.NET обновит поля данных ListPrice и ModifiedDate в базе данных.

  4. В любой строке щелкните Изменить и в поле Color введите пустую строку, после чего щелкните Обновить.

    ASP.NET выведет пользовательское сообщение об ошибке проверки.

    Тестирование цвета DDS
  5. В той же строке введите в столбец Color отличное от пустой строки значение и щелкните Обновить.

    ASP.NET обновит поля данных Color и ModifiedDate в базе данных.

Показ: