Вопрос о том, как использовать сильный введенный набор данных в приложении N-tier для.NET

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

  • Я хочу записать приложение N-tier, где Уровень представления находится в формах C#/windows, Бизнес-Слой является веб-сервисом, и Уровень доступа к данным является дб SQL.

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

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

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

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

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

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

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

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

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

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

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

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

6
задан John Saunders 5 April 2010 в 02:41
поделиться

3 ответа

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

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

0
ответ дан 17 December 2019 в 20:30
поделиться

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

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

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

2
ответ дан 17 December 2019 в 20:30
поделиться

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

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

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

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

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

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

0
ответ дан 17 December 2019 в 20:30
поделиться