Поделиться через


N-уровневое использование LINQ to SQL с веб-службами

LINQ to SQL предназначен специально для использования на среднем уровне в свободно связанном уровне доступа к данным (DAL), таком как веб-служба. Если уровень презентации является веб-страницей ASP.NET, вы используете LinqDataSource элемент управления веб-сервера для управления передачей данных между пользовательским интерфейсом и LINQ to SQL на среднем уровне. Если уровень представления данных не является страницей ASP.NET, то и на среднем уровне, и на уровне представления данных необходимо выполнить дополнительные действия по управлению сериализацией и десериализацией данных.

Настройка технологии LINQ to SQL на среднем уровне

Средний уровень веб-службы или многоуровневого приложения содержит контекст данных и классы сущностей. Эти классы можно создать вручную или с помощью SQLMetal.exe или реляционный конструктор объектов, как описано в документации. Во время разработки можно сделать класс сущностей сериализуемым. Дополнительные сведения см. в разделе "Практическое руководство. Создание сериализуемых сущностей". Другим вариантом является создание отдельного набора классов, которые инкапсулируют данные для сериализации, а затем проектируются в эти сериализуемые типы при возврате данных в запросах LINQ.

Затем следует определить интерфейс с методами, которые клиенты будут вызывать для извлечения, вставки и обновления данных. Методы интерфейса обтекают запросы LINQ. Для обработки удаленных вызовов методов и сериализации данных можно использовать любой вид механизма сериализации. Единственное требование заключается в том, что если в объектной модели существуют циклические или двунаправленные отношения, например между классами "Customers" и "Orders" в стандартной объектной модели "Northwind", то необходимо использовать сериализатор, который поддерживает такие отношения. Сериализатор Windows Communication Foundation (WCF) DataContractSerializer поддерживает двунаправленные отношения, а сериализатор XmlSerializer, который используется для веб-служб, не совместимых с WCF, не поддерживает. Если используется сериализатор XmlSerializer, то необходимо убедиться, что в объектной модели отсутствуют циклические связи.

Дополнительные сведения о Windows Communication Foundation см. в разделе "Службы Windows Communication Foundation" и службы данных WCF в Visual Studio.

Реализуйте бизнес-правила или другую логику для конкретного домена, используя частичные классы и методы классов сущностей для DataContext перехвата в события среды выполнения LINQ to SQL. Дополнительные сведения см. в разделе "Реализация бизнес-логики N-уровней".

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

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

Извлечение и вставка данных

Средний уровень определяет интерфейс, указывающий, как уровень представления данных получает доступ к данным. например GetProductByID(int productID) или GetCustomers(). На среднем уровне тело метода обычно создает новый экземпляр класса DataContext и выполняет запрос к одной или нескольким своим таблицам. Затем средний уровень возвращает результат в виде интерфейса IEnumerable<T>, где T является классом сущностей или другим типом, используемым для сериализации. Уровень представления данных никогда не отправляет переменные запроса непосредственно на средний уровень и не получает этих переменных из среднего уровня. Оба уровня обмениваются значениями, объектами и коллекциями конкретных данных. После получения коллекции уровень презентации может использовать LINQ to Objects для запроса при необходимости.

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

Отслеживание изменений для обновления и удаления

LINQ to SQL поддерживает оптимистическое параллелизм на основе меток времени (также именованных RowVersions) и исходных значений. Если таблицам базы данных присвоены метки времени, то для операций обновления и удаления требуются некоторые дополнительные действия либо на среднем уровне, либо на уровне представления данных. Однако если для проверок на оптимистический параллелизм необходимо использовать исходные значения, то ответственность за отслеживание этих значений и отправку их обратно при выполнении обновлений лежит на уровне представления данных. Причиной этого является тот факт, что изменения сущностей, выполненные на уровне представления данных, не отслеживаются на среднем уровне. В действительности, исходное извлечение сущности и окончательное его обновление обычно выполняется двумя совершенно различными экземплярами класса DataContext.

Чем больше количество изменений, выполненных на уровне представления данных, тем сложнее становится отслеживать эти изменения и отправлять их в пакетах обратно на средний уровень. Реализация механизма передачи изменений полностью зависит от приложения. Единственное требование заключается в том, что LINQ to SQL необходимо указать исходные значения, необходимые для оптимистического параллелизма проверка.

Дополнительные сведения см. в разделе "Извлечение данных" и операции CUD в N-уровнях приложений (LINQ to SQL).

См. также