Вопрос о том, как использовать строго типизированный набор данных в N-уровневом приложении для .NET - PullRequest
6 голосов
/ 05 апреля 2010

Мне нужен совет специалиста по наборам строго типизированных данных в ADO.NET, сгенерированных Visual Studio. Вот подробности. Заранее спасибо.

  • Я хочу написать N-уровневое приложение, в котором слой Presentation находится в C # / окнах форм, Business Layer - это веб-сервис, а Data Access Layer - SQL db.

  • Итак, я использовал Visual Studio 2005 для этого и создал 3 проекта в решении.

  • проект 1 - уровень доступа к данным. В этом я использовал генератор наборов данных Visual Studio для создания строго типизированного набора данных и адаптера таблицы (для проверки я создал это на таблице клиентов в северном ветре). Набор данных называется NorthWindDataSet, а таблица внутри - CustomersTable.

  • У проекта 2 есть веб-сервис, который предоставляет только 1 метод - GetCustomersDataSet. Это использует адаптер таблицы библиотеки project1, чтобы заполнить набор данных и вернуть его вызывающей стороне. Чтобы иметь возможность использовать NorthWindDataSet и табличный адаптер, я добавил ссылку на проект 1.

  • project 3 - это приложение для создания выигрышных форм, которое использует веб-службу в качестве справочной информации и вызывает эту службу для получения набора данных.

В процессе создания этого приложения в PL я добавил ссылку на DataSet, сгенерированный выше в проекте 1, и при загрузке формы я вызываю веб-сервис и назначаю полученный набор данных из веб-сервиса этому набору данных. Но я получаю ошибку:

Невозможно неявно преобразовать тип 'PL.WebServiceLayerReference.NorthwindDataSet' в «BL.NorthwindDataSet» e: \ My Документы \ Visual Studio 2008 \ Projects \ DataSetWebServiceExample \ PL \ Form1.cs

Оба набора данных одинаковы, но из-за того, что я добавил ссылки из разных мест, я думаю, что я получаю вышеуказанную ошибку.

Итак, я добавил ссылку на проект 1 (который определяет набор данных) в проект 3 (пользовательский интерфейс) и использовал веб-сервис для получения DataSet и получения нужного типа, теперь, когда проект 3 (который имеет веб-форму) запускается, я получаю исключение во время выполнения ниже.

System.InvalidOperationException: Ошибка в XML-документе (1, 5058). ---> System.Xml.Schema.XmlSchemaException: Множественное определение элемента «http://tempuri.org/NorthwindDataSet.xsd:Customers' заставляет модель контента становиться неоднозначный. Модель контента должна быть сформирован так, что во время проверки последовательность элементов информации об элементе, частица содержала непосредственно, косвенно или косвенно который пытается проверить каждый элемент в последовательности в свою очередь может быть однозначно определяется без изучения содержание или атрибуты этого пункт, и без какой-либо информации о предметах в оставшейся части последовательность.

Я думаю, это может быть из-за некоторых ошибок перекрестных ссылок.

У меня вопрос, есть ли способ использовать сгенерированные Visual Studio DataSets таким образом, чтобы я мог использовать один и тот же DataSet на всех уровнях (для повторного использования), но отделить логику адаптера таблицы от уровня доступа к данным, чтобы веб-сервис абстрагируется от всего этого?

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

Ответы [ 3 ]

2 голосов
/ 05 апреля 2010

Я бы держался подальше от наборов данных на вашем месте. Они в значительной степени являются решением проблемы .NET 2.0, и они также не были очень хорошим решением.

Я бы использовал Entity Framework в качестве слоя данных - у них нет проблем с DataSet, включая ту, которую вы видите. DataSet должен жить в обоих мирах - и XML, и реляционных, и они не всегда подходят. Entity Framework может создавать модели объектов, которые должны соответствовать только стандартным концепциям программирования, таким как наследование и ассоциация.

Entity Framework также имеет меньше проблем при передаче через веб-сервисы. Вы должны использовать WCF для всей своей новой работы с веб-сервисами (Microsoft теперь считает веб-сервисы ASMX «устаревшей технологией»), но даже с веб-сервисами ASMX объекты EF будут передаваться достаточно чисто. В .NET 3.5 есть некоторые относительно незначительные проблемы, но они решаются в .NET 4.0.

0 голосов
/ 05 апреля 2010

У меня вопрос, есть ли способ использовать сгенерированные Visual Studio DataSets таким образом, чтобы я мог использовать один и тот же DataSet на всех уровнях (для повторного использования), но отделить логику адаптера таблицы от уровня доступа к данным, чтобы интерфейс всего этого абстрагируется от веб-службы

Если вы не хотите переписывать свое приложение для EF или добавлять DTO, и вы знаете, что схемы равны, вы можете установить схему набора данных на своем уровне представления через веб-сервис.

Project3DataSet.ReadXmlSchema(  
    new StringReader(Project2WebService.GetCustomersDataSetSchema()));

[WebMethod]
public string GetCustomersDataSetSchema()
{
   return new Project1DataSet().GetXmlSchema();
}

Ваша схема набора данных действует как объектная модель. Не красиво, но должно делать работу.

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

0 голосов
/ 05 апреля 2010

Я бы поддержал Джона здесь, мы используем EF v1.0 в N-многоуровневом приложении и, конечно, у него есть свои проблемы, но вы получаете обычные объекты, которые вы можете протолкнуть через сервис. Однако я бы посоветовал (в случае, если вы используете EF1, а не EF4, который имеет возможность выставлять свои объекты как POCO), иметь отдельный слой объектов DTO, который я бы сопоставил с объектами DO из вашего DAL, и использовать DTO для передачи через сервис , Также рассмотрите возможность использования сервисов .NET RIA, они действительно фантастические

@ sb: на DTO , на EF , быстрый просмотр услуг RIA , Старая статья о DTO с наборами данных , что вы пытаетесь сделать.

...