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

 

Опубликовано: Июль 2016

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

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

В данном пошаговом руководстве демонстрируется, как разделить набор данных и код TableAdapter по отдельным проектам библиотеки классов с помощью Конструктора наборов данных. После разделения набора данных и кода адаптера таблицы вы создадите службу Windows Communication Foundation Services and WCF Data Services in Visual Studio для вызова уровня доступа к данным. Наконец, вы создадите приложение Windows Forms в качестве уровня представления. Этот уровень осуществляет доступ к данным из службы данных.

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

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

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

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

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

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

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

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

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

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

ссылка на видео Видеоверсию этого раздела см. на странице Видео: создание N-уровневого приложения для работы с данными.

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

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

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

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

Примечание

Обязательно присвойте проекту и решению правильные имена перед нажатием кнопки ОК. Это облегчит выполнение данного пошагового руководства.

Создание n-уровневого решения и библиотеки классов DataEntityTier

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

    Примечание

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

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

  3. Щелкните шаблон Библиотека классов.

  4. Присвойте проекту имя "DataEntityTier".

  5. Присвойте решению имя "NTierWalkthrough".

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

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

Создание библиотеки классов для хранения адаптеров таблицы (DataAccessTier)

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

Создание новой библиотеки классов для адаптеров таблиц

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

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

  3. Присвойте проекту имя "DataAccessTier" и нажмите кнопку ОК.

    Создается проект DataAccessTier, который добавляется в решение NTierWalkthrough.

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

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

Примечание

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

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

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

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

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

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

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

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

    -или-

    Выберите Новое подключение для открытия диалогового окна Добавить подключение.

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

    Примечание

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

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

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

  9. Установите флажки для таблиц Клиенты и Заказы, а затем нажмите кнопку Готово.

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

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

После создания набора данных отделите сформированный класс набора данных от адаптеров таблицы. Для этого задайте для свойства Проект DataSet имя проекта, в котором требуется хранить отделенный класс набора данных.

Порядок отделения адаптеров таблиц от набора данных

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

  2. Щелкните пустое пространство в конструкторе.

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

  4. В списке Проект DataSet щелкните DataEntityTier.

  5. В меню Сборка выберите Собрать решение.

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

Примечание

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

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

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

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

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

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

  3. Присвойте проекту имя "DataService " и нажмите кнопку ОК.

    Создается проект DataService, который добавляется в решение NTierWalkthrough.

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

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

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

  1. В области Обозреватель решений дважды щелкните NorthwindDataset.xsd, чтобы открыть набор данных в Создание и изменение типизированных наборов данных.

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

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

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

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

  6. На странице Выбор методов для автоматического создания введите GetCustomers для параметра Имя метода в разделе Вернуть таблицу данных (DataTable).

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

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

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

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

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

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

  5. На странице Выбор методов для автоматического создания введите GetOrders для параметра Имя метода в разделе Вернуть таблицу данных (DataTable).

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

  7. В меню Сборка выберите Собрать решение.

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

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

Добавление ссылок в службу данных

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

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

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

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

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

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

Примечание

Для проектов 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 дважды щелкните Service1.vb (или Service1.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 — это уровень представления n-уровневого приложения.

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

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

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

  3. Присвойте проекту имя "PresentationTier" и нажмите кнопку ОК.

  4. Создается проект PresentationTier, который добавляется в решение NTierWalkthrough.

Настройка проекта PresentationTier в качестве запускаемого

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

Порядок настройки нового проекта уровня представления в качестве запускаемого

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

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

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

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

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

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

  3. Выберите DataEntityTier и нажмите кнопку ОК.

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

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

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

  3. Выберите Service1 и нажмите кнопку ОК.

    Примечание

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

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

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

Создание двух элементов DataGridView с привязкой к данным на форме

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

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

  3. Перетащите узел Клиенты на Form1.

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

  5. Перетащите связанный узел Заказы на 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());  
    

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

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

Примечание

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

Увеличение значения maxReceivedMessageSize

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

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

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

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

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

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

  2. Данные из таблиц клиентов и заказов извлекаются из службы данных и отображаются на форме.

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

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

См. также

Работа с наборами данных в N-уровневых приложениях
Иерархическое обновление
Доступ к данным в Visual Studio