Silverlight 3: Отображение данных SQL Server - Добавление WCF

ОГЛАВЛЕНИЕ

Добавление WCF

После установки класса LINQ для SQL и создания класса ContactRecord пора добавить класс основы связи Windows в проект AdventureWorks_WebServer. Этот класс будет играть роль службы, использующей класс LINQ для SQL для извлечения данных из базы данных AdventureWorks и возврата их в клиентское приложение Silverlight.

В проводнике решения щелкните правой кнопкой мыши по узлу проекта AdventureWorks_WebServer и выберите “Добавить | Новый элемент…“ Щелкните по узлу Silverlight, потом выберите шаблон службы WCF с поддержкой Silverlight. Оставьте имя “Service1.svc” и нажмите кнопку “Добавить“.

Так выглядит окно добавления шаблона службы WCF:

После добавления службы WCF файл “Service1.svc” добавится в узел проекта AdventureWorks_WebServer в проводнике решения. Если он не открылся автоматически, дважды щелкните по нему, чтобы открыть окно кода.

Окно кода должно выглядеть так:

Imports System.ServiceModel
Imports System.ServiceModel.Activation

<ServiceContract(Namespace:="")> _
<AspNetCompatibilityRequirements( _
    RequirementsMode:= _
    AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class Service1

    <OperationContract()> _
    Public Sub DoWork()
        ' Добавить сюда реализацию операции
    End Sub

    ' Добавить сюда больше операций и пометить их
    '  <OperationContract()>

End Class

Со службой будет сделана пара вещей:
•    Добавить пространство имен в ServiceContract. Это обеспечит уникальность пользовательских типов.
Пространство имен должно быть URI, но не обязательно указывающее на реальное место в интернете. Оно служит лишь уникальным идентификатором для пользовательского типа.
•    Удалить весь код и комментарии внутри класса.

Добавить функцию GetContacts

Надо добавить собственную функцию GetContacts(), вызываемую из клиентского приложения Silverlight. При добавлении этой функции объявите возвращаемый тип как List(Of ContactRecord) и обязательно добавьте атрибут <OperationContract()> прямо над именем функции. Это сделает данную функцию доступной для клиента Silverlight.

После добавления пространства имен и функции GetContactions() окно кода должно выглядеть так:

Imports System.ServiceModel
Imports System.ServiceModel.Activation

<ServiceContract(Namespace:="http://adventureworks.com/")> _
<AspNetCompatibilityRequirements( _
    RequirementsMode:= _
    AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class Service1

    <OperationContract()> _
    Public Function GetContacts() _
        As List(Of ContactRecord)

    End Function

End Class

Добавить код в функцию GetContacts

Внутри функции GetContacts() можно использовать добавленный класс LINQ для SQL “DataClasses1.dbml” и, разумеется, LINQ, для доступа к данным в таблице контактов базы данных AdventureWorks. В список добавляются первые 1000 строк, и список возвращается.

Так выглядит функция:

<OperationContract()> _
Public Function GetContacts() As List(Of ContactRecord)

    'Использовать класс LINQ для SQL для доступа к
    '  таблице контактов в базе данных Adventure-
    '  Works.
    Dim db As New DataClasses1DataContext()

    'Использовать LINQ для извлечения строк из
    '  таблицы контактов.
    '  Метод ".Take(1000)"
    '  возвращает первые (верхние) 1000 строк
    '  из набора результатов.
    Dim contacts = _
        (From contact _
        In db.Contacts _
        Order By contact.FirstName, _
            contact.LastName _
        Select contact).Take(1000)

    'Создать новый обобщенный список типа запись
    '  контакта. Этот список будет
    '  возвращен клиентскому приложению Silverlight
    '
    Dim list As New List(Of ContactRecord)

    'Обойти в цикле каждую строку таблицы
    'контактов и добавить ее в список.
    For Each c In contacts

        list.Add( _
            New ContactRecord With _
                 {.FirstName = c.FirstName, _
                  .LastName = c.LastName, _
                  .Email = c.EmailAddress})

    Next

    'Вернуть список
    Return list

End Function

Далее сохраните проект (Меню Файл | Сохранить все).