Пошаговое руководство. Создание многоуровневого приложения для работы с данными

Обновлен: Ноябрь 2007

Многоуровневые приложения обработки данных — это приложения с использованием элементов данных, разделенные на несколько логических слоев (или уровней). Разделение компонентов приложения на разные уровни увеличивает эксплуатационную надежность и масштабируемость приложения. Это осуществляется за счет возможности применения новых технологий к какому-либо одному уровню без необходимости изменять все решение. Архитектура типичного многоуровневого приложения включает уровень представления, средний уровень и уровень данных. Средний уровень обычно включает слой доступа к данным, слой бизнес-логики и общие компоненты, такие как аутентификация и прочие инструменты проверки. Уровень данных включает реляционную базу данных. Многоуровневые приложения обычно хранят важные сведения в слое доступа к данным среднего уровня для сохранения изоляции от конечных пользователей, имеющих доступ к уровню представления. Дополнительные сведения см. в разделе Общие сведения о N-уровневом приложении для обработки данных.

Одним из способов разделения различных уровней является создание дискретных проектов для каждого уровня, который нужно включить в приложение. Типизированные наборы данных содержат свойство DataSet Project, которое определяет, в каких проектах должен использоваться код TableAdapter.

Это пошаговое руководство демонстрирует разделение набора данных и кода TableAdapter на различные библиотеки классов с помощью Конструктора наборов данных. После разделения набора данных и кода адаптера таблиц будет создана служба Службы Windows Communication Foundation и службы данных ADO.NET для вызова уровня доступа к данным. Наконец, будет создано приложение Windows Forms в качестве уровня презентации. Этот уровень обращается к данным из службы данных.

В пошаговом руководстве будут выполняться следующие задачи:

  • Создание нового многоуровневого решения, которое будет содержать несколько проектов.

  • Добавление двух проектов библиотек классов в многоуровневое решение.

  • Создание типизированного набора данных с помощью Мастера настройки источников данных.

  • Разделение создаваемых Адаптер таблицы и кода набора данных на отдельные проекты.

  • Создание службы Windows Communication Foundation (WCF) для вызова уровня доступа к данным.

  • Создание в службе функций извлечения данных из уровня доступа к данным.

  • Создание приложения Windows Forms, которое будет служить уровнем представления.

  • Создание элементов управления Windows Forms, которые привязаны к источнику данных.

  • Написание кода для заполнения таблиц данных.

ссылка на видео Для просмотра видеодемонстрации см. Видео. Практическое руководство. Создание многоуровнего приложения для работы с данными.

Обязательные компоненты

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

Создание многоуровневого решения и библиотеки классов для поддержки набора данных (DataEntityTier)

Первый шаг этого примера — создание решения и двух проектов библиотек классов. В первой библиотеке классов будет содержаться набор данных (созданный типизированный класс DataSet и объекты DataTable, которые будут содержать данные приложения). Этот проект используется в качестве слоя сущностей данных приложения и обычно размещается в среднем уровне. Конструктор наборов данных используется для создания исходного набора данных и автоматического разделения кода на две библиотеки классов.

Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

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

Для создания многоуровневого решения и библиотеки классов DataEntityTier:

  1. Из меню Файл создайте новый проект.

    Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

    Конструктор наборов данных поддерживается в проектах Visual Basic и C#. Создайте новый проект на одном из этих языков.

  2. В диалоговом окне Новый проект в области Типы проектов выберите Windows.

  3. Выберите шаблон Библиотека классов.

  4. Назовите проект DataEntityTier.

  5. Назовите решение NTierWalkthrough.

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

    Решение NTierWalkthrough, содержащее проект DataEntityTier, создается и добавляется в Обозреватель решений.

Создание библиотеки классов для поддержки объектов TableAdapter (DataAccessTier)

Следующим шагом после создания проекта DataEntityTier является создание другого проекта библиотеки классов. Этот проект будет содержать созданные объекты TableAdapter и называться уровнем доступа к данным приложения. Слой доступа к данным содержит сведения для подключения к базе данных и обычно размещается в среднем уровне.

Для создания новой библиотеки классов для TableAdapters:

  1. Из меню Файл добавьте новый проект к решению NTierWalkthrough.

  2. В диалоговом окне Новый проект в области Шаблоны выберите Библиотека классов.

  3. Назовите проект DataAccessTier и нажмите кнопку OK.

    Проект DataAccessTier создается и добавляется в решение NTierWalkthrough.

Создание набора данных

Следующим шагом является создание типизированного набора данных. Типизированные наборы данных создаются в виде класса набора данных (включая классы DataTable) и классов TableAdapter в отдельном проекте. (Все классы создаются в одном файле.) При разделении набора данных и TableAdapter на различные проекты класс набора данных перемещается в другой проект, оставляя классы TableAdapter в исходном проекте. Таким образом создайте набор данных в проекте, который будет в конечном счете содержать TableAdapter (проект DataAccessTier). Набор данных создается при помощи Мастера настройки источника данных.

Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

Для создания подключения необходимо иметь доступ к демонстрационной базе данных Northwind. Сведения о настройке учебной базы данных "Northwind" содержатся в Практическое руководство. Установка образцов баз данных.

Для создания набора данных:

  1. Щелкните DataAccessTier в Обозревателе решений.

  2. В меню Данные выберите команду Показать источники данных.

  3. В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.

  4. На странице Выбор типа источника данных выберите База данных и нажмите кнопку Далее.

  5. На странице Выбор подключения к базе данных выполните одно из следующих действий:

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

    либо

    Выберите Новое подключение для открытия диалогового окна Добавить подключение. Дополнительные сведения см. в разделе Диалоговое окно "Добавить/Изменить подключение" (вкладка "Общие").

  6. Если базе данных требуется пароль, выберите параметр для включения конфиденциальных данных и нажмите кнопку Далее.

    Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

    Если выбран файл локальной базы данных (вместо подключения к SQL Server), то возможен запрос, требуется ли добавить файл к проекту. Нажмите Да для добавления файла базы данных в проект.

  7. Нажмите кнопку Далее на странице Сохранить строку подключения в файл конфигурации приложения.

  8. Раскройте узел Таблицы на странице Выбор объектов базы данных.

  9. Установите флажки для таблиц Customers и Orders и нажмите кнопку Готово.

    NorthwindDataSet добавляется к проекту DataAccessTier и отображается в окне Источники данных.

Разделение объектов TableAdapter из набора данных

После создания набора данных следует отделить класс набора данных от TableAdapter. Это можно сделать, задав свойство Проект набора данных именем проекта, в котором необходимо сохранить отделенный класс набора данных.

Разделение объектов TableAdapter от набора данных

  1. Дважды щелкните NorthwindDataSet.xsd в Обозревателе решений для открытия набора данных в Конструкторе наборов данных.

  2. Щелкните пустую область в конструкторе наборов данных.

  3. Найдите узел Проект набора данных в окне Свойства.

  4. В списке Проект наборов данных выберите DataEntityTier.

  5. В меню Построение выберите Построить решение.

Набор данных и объекты TableAdapter разделяются на два проекта библиотеки классов. Проект, который изначально содержит весь набор данных (DataAccessTier), теперь содержит только объекты TableAdapter. Проект, указанный в свойстве DataSet Project (DataEntityTier), содержит типизированный набор данных: NorthwindDataSet.Dataset.Designer.vb (или NorthwindDataSet.Dataset.Designer.cs).

Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

После разделения наборов данных и адаптеров таблиц (путем установки свойства Проект набора данных) существующие в проекте разделяемые классы наборов данных не будут перемещаться автоматически. Существующие разделяемые классы наборов данных должны быть вручную перемещены в проект набора данных.

Создание нового приложения службы

Поскольку данный пример демонстрирует, как получить доступ к уровню доступа данных с помощью службы WCF, создайте новое приложение WCF службы.

Чтобы создать новое приложение службы WCF:

  1. Из меню Файл добавьте новый проект к решению NTierWalkthrough.

  2. В диалоговом окне Новый проект в области Типы проектов выберите WCF. В области Шаблоны выберите Библиотека службы WCF.

  3. Назовите проект DataService и нажмите кнопку OK.

    Проект DataService создается и добавляется в решение NTierWalkthrough.

Создание методов уровня доступа к данным для возврата данных из таблиц Customers и Orders

Служба данных должна вызвать два метода в уровень доступа к данным: GetCustomers и GetOrders. Эти методы возвращают таблицы Customers и Orders базы данных Northwind. Создание методов GetCustomers и GetOrders в проекте DataAccessTier.

Для создания метода на уровне доступа к данным, возвращающего таблицу Customers:

  1. Дважды щелкните NorthwindDataset.xsd в Обозревателе решений для открытия набора данных в Конструктор наборов данных.

  2. Щелкните правой кнопкой мыши CustomersTableAdapter и выберите команду Добавить запрос, чтобы открыть мастер Мастер настройки запроса адаптера таблицы.

  3. На странице Выбор типа команды оставьте значение по умолчанию Использовать инструкции SQL и нажмите кнопку Далее.

  4. На странице Выбор типа запроса оставьте значение по умолчанию SELECT, возвращающее строки и нажмите кнопку Далее.

  5. На странице Определение инструкции SQL SELECT оставьте запрос по умолчанию и нажмите кнопку Далее.

  6. На странице Выбор методов для создания введите GetCustomers в поле Имя метода в разделе Возврат DataTable.

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

Для создания метода на уровне доступа к данным, возвращающего таблицу Orders:

  1. Щелкните правой кнопкой мыши OrdersTableAdapter и выберите команду Добавить запрос.

  2. На странице Выбор типа команды оставьте значение по умолчанию Использовать инструкции SQL и нажмите кнопку Далее.

  3. На странице Выбор типа запроса оставьте значение по умолчанию SELECT, возвращающее строки и нажмите кнопку Далее.

  4. На странице Определение инструкции SQL SELECT оставьте запрос по умолчанию и нажмите кнопку Далее.

  5. На странице Выбор методов для создания введите GetOrders в поле Имя метода в разделе Возврат DataTable.

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

  7. В меню Построение выберите Построить решение.

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

Поскольку служба данных требует информацию из набора данных и объектов TableAdapter, добавьте ссылки на проекты DataEntityTier и DataAccessTier.

Чтобы добавить ссылки для службы данных:

  1. Щелкните правой кнопкой мыши DataService в Обозревателе решений и выберите команду Добавить ссылку.

  2. Перейдите на вкладку Проекты в диалоговом окне Добавить ссылку.

  3. Выберите проекты DataAccessTier и DataEntityTier.

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

Добавление функций в службу для вызова методов GetCustomers и GetOrders в уровне доступа к данным

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

Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

Для проектов C# необходимо добавить ссылку на сборку System.Data.DataSetExtensions для компиляции следующего кода.

Чтобы создать функции GetCustomers и GetOrders в службе данных:

  1. В проекте DataService дважды щелкните IService1.vb или IService1.cs.

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

    <OperationContract()> _
    Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable
    
    <OperationContract()> _
    Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    
  3. В проекте DataService дважды щелкните IService1.vb (или IService1.cs).

  4. Добавьте в класс Service1 следующий код:

    Public Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable Implements IService1.GetCustomers
        Dim CustomersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
        Return CustomersTableAdapter1.GetCustomers()
    End Function
    
    Public Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable Implements IService1.GetOrders
        Dim OrdersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
        Return OrdersTableAdapter1.GetOrders()
    End Function
    
    public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
             CustomersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter();
        return CustomersTableAdapter1.GetCustomers();
    
    }
    public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
             OrdersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter();
        return OrdersTableAdapter1.GetOrders();
    
    }
    
  5. В меню Построение выберите Построить решение.

Создание уровня представления для отображения данных из службы данных

Теперь, когда решение содержит службу данных, имеет методы, вызывающие уровень доступа к данным, создайте другой проект, который будет вызывать службу данных и представлять данные для пользователей. В данном пошаговом руководстве создайте приложение Windows Forms; это уровень представления многоуровневого приложения.

Для создания проекта уровня представления:

  1. Из меню Файл добавьте новый проект к решению NTierWalkthrough.

  2. В диалоговом окне Новый проект в области Типы проектов выберите Windows. Нажмите Приложение Windows Forms в области Шаблоны.

  3. Назовите проект PresentationTier и нажмите кнопку OK.

  4. Проект PresentationTier создается и добавляется в решение NTierWalkthrough.

Установка проекта PresentationTier Project в качестве автозагружаемого проекта

Поскольку уровень представления является фактически клиентским приложением и используется для представления и взаимодействия с данными, необходимо установить проект PresentationTier в качестве автоматически загружаемого проекта.

Чтобы установить новый проект уровня представления в качестве автоматически загружаемого проекта:

  • В Обозревателе решений щелкните правой кнопкой мыши по проекту PresentationTier и выберите Назначить автоматически загружаемым проектом.

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

Клиентское приложение PresentationTier требует наличия ссылки на службу данных для вызова ее методов. Кроме того, необходима ссылка на набор данных для включения общего доступа к типам в WCF службе. До тех пор, пока не включено совместное использование типов через службу данных, код, добавленный к классу частичного набора данных, не доступен для уровня представления. Поскольку обычно добавляется код, подобный проверке изменения строк и столбцов в ответ на события изменения таблицы данных, то, скорее всего, будет необходимо получить доступ к этому коду из клиента. Дополнительные сведения см. в разделе Использование служб WCF в Visual Studio.

Чтобы добавить ссылку на уровень представления:

  1. В Обозревателе решений щелкните правой кнопкой мыши узел проекта PresentationTier и выберите Добавить ссылку.

  2. Перейдите на вкладку Проекты в диалоговом окне Добавить ссылку.

  3. Выберите DataEntityTier и нажмите OK.

Чтобы добавить ссылку на службу данных в уровень представления:

  1. В Обозревателе решений щелкните правой кнопкой мыши узел проекта PresentationTier и выберите Добавить ссылку.

  2. В диалоговом окне Добавить ссылку на службу выберите Найти.

  3. Выберите Service1 и нажмите OK.

    Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

    Если на текущем компьютере имеется несколько служб, выберите службу, созданную ранее в данном пошаговом руководстве (содержит методы GetCustomers и GetOrders).

Добавление элементов DataGridView на форму для отображения данных, возвращаемых службой

После добавления ссылки на службу данных окно Источники данных автоматически заполняется данными, возвращаемыми службой.

Для добавления двух привязанных к данным DataGridViews на форму:

  1. Выберите проект PresentationTier в Обозревателе решений.

  2. В окне Источники данных разверните NorthwindDataSet и найдите узел Customers.

  3. Перетащите узел Customers на форму Form1.

  4. В окне Источники данных разверните узел Customers и найдите связанный узел Orders (узел Orders вложен в Customers).

  5. Перетащите связанный узел Orders на форму Form1.

  6. Создайте обработчик событий Form1_Load, дважды щелкнув пустую область формы.

  7. В обработчик событий Form1_Load добавьте следующий код.

    Dim DataSvc As New ServiceReference1.Service1Client
    NorthwindDataSet.Customers.Merge(DataSvc.GetCustomers)
    NorthwindDataSet.Orders.Merge(DataSvc.GetOrders)
    
    ServiceReference1.Service1Client DataSvc = 
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

Увеличение максимального размера сообщения для службы

Поскольку служба возвращает данные из таблиц Customers и Orders, значение по умолчанию для maxReceivedMessageSize недостаточно велико для хранения данных и должно быть увеличено. В данном пошаговом руководстве предстоит изменить значение на 6553600. Измените значение на клиенте, и он автоматически обновит службу.

Bb384570.alert_note(ru-ru,VS.90).gifПримечание.

Нижний размер по умолчанию предназначен для того, чтобы ограничить воздействие атаки типа "отказ в обслуживании (DoS)". Дополнительные сведения см. в разделе MaxReceivedMessageSize.

Чтобы увеличить значение maxReceivedMessageSize:

  1. В Обозревателе решений дважды щелкните файл app.config в проекте PresentationTier.

  2. Найдите атрибут maxReceivedMessage и измените его значение на 6553600.

Тестирование приложения

Запустите приложение. Данные получены из службы данных и отображены на форме.

Тестирование приложения

  1. Нажмите клавишу F5.

  2. Данные таблицы Customers извлекаются из локальной базы данных, а данные таблицы Orders — из службы данных.

Следующие действия

В зависимости от требований приложения существуют несколько шагов, выполнение которых может потребоваться после сохранения связанных данных в приложении Windows. Например, можно внести в приложение следующие усовершенствования:

См. также

Основные понятия

Новые возможности данных

Другие ресурсы

Многоуровневые приложения для работы с данными

Иерархическое обновление

Доступ к данным (Visual Studio)