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


Службы доменов

Службы домена — это службы Windows Communication Foundation (WCF), в которых инкапсулируется бизнес-логика приложения Службы WCF RIA. Служба домена предоставляет доступ к набору связанных операций в виде уровня службы. При определении службы домена указываются операции с данными, которые разрешается выполнять через службу домена.

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

Службы домена и их источники данных

Класс DomainService является базовым для всех классов, представляющих службы домена. Чтобы создать службу домена, которая привязывается к пользовательскому объекту данных, необходимо создать класс, производный непосредственно от DomainService. Однако в случае службы домена, которая либо привязывается к модели ADO.NET EDM, либо предоставляет LINK для базы данных SQL, имеются специальные абстрактные классы, производные от DomainService, которые используются вместо этого.

  • Чтобы создать службу домена, которая привязывается к модели ADO.NET EDM, необходимо создать класс, производный от LinqToEntitiesDomainService. Службы RIA предоставляет класс LinqToEntitiesDomainService.

  • Если требуется создать службы домена, предоставляющие классы LINQ to SQL в вашем приложении, необходимо создать класс, производный от LinqToSqlDomainService. Этот класс поставляется в наборе средств служб полнофункционального интернет-приложения. Если требуется создать службы домена, предоставляющие классы LINQ to SQL в вашем приложении с использованием этого класса, необходимо загрузить набор средств Службы RIA .

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

Класс службы домена должен быть помечен атрибутом EnableClientAccessAttribute, чтобы сделать службу доступной для клиентского проекта. Атрибут EnableClientAccessAttribute автоматически применяется к службе домена, когда в диалоговом окне Добавление нового класса службы домена устанавливается флажок Включить клиентский доступ. При применении атрибута EnableClientAccessAttribute к службе домена Службы RIA создает соответствующие классы для клиентского проекта. Например, если применить атрибут EnableClientAccessAttribute к службе домена с именем HRService, которая предоставляет сущность с именем Employee, Службы RIA создает контекст домена с именем HRContext в клиентском проекте и клиентскую версию сущности Employee.

WCF и службы домена

Как служба Windows Communication Foundation (WCF), служба домена основывается на концепциях WCF. Служба домена хранит в себе следующее:

  • Стандартное использование служб WCF

  • Существующие конструкции моделей программирования WCF, например конструкции операций, поведения операций и поведения служб

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

Контекст домена связывается со службой домена Службы RIA с использованием WCF ChannelFactory для создания канала и передачи ему контракта службы, созданного из службы домена.

По умолчанию для служб домена включена только конечная точка с двоичным кодированием. Для использования конечной точки с двоичным кодированием дополнительная настройка не требуется. Если требуется использовать другую конечную точку (например, OData, JSON, SOAP или настраиваемый узел), необходимо зарегистрировать фабрику конечных точек в файле Web.config, как показано ниже.

<configSections>
  <sectionGroup name="system.serviceModel">
    <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.serviceModel>
  <domainServices>
    <endpoints>
      <add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
    </endpoints>
  </domainServices>
<system.serviceModel>

Пространство имен System.ServiceModel.DomainServices.Hosting содержит конечные точки, поддерживаемые в Службы RIA . Пространство имен Microsoft.ServiceModel.DomainServices.Hosting содержит конечные точки, поддерживаемые набором средств Службы RIA , например JsonEndpointFactory, показанную в предыдущем примере. Чтобы создать пользовательскую конечную точку, необходимо создать класс, производный от класса DomainServiceEndpointFactory, и переопределить метод CreateEndpoints.

Операции с данными

В службу домена следует добавить методы, выполняющие операции с данными, которые следует предоставить. Например, можно добавить методы, выполняющие следующие операции:

  • Query

  • Update

  • Insert

  • Delete

Также можно добавить более сложные операции, например:

  • Invoke: для реализации операций, которые требуется выполнить без отслеживания или отложенного выполнения. Этот метод используется только с данными, не организованными в сущности, и только в случае, если нельзя использовать операции запроса, обновления, вставки или удаления.

  • Named Update: для реализации пользовательских операций, неразбиваемых на простые операции изменения.

При предоставлении службы домена в контексте домена создается объект EntitySet со свойствами, указывающими, какие операции (вставка, обновление или удаление) разрешены со стороны клиента. Изменение данных выполняется путем изменения коллекции сущностей и последующего вызова метода SubmitChanges.

Практически во всех сценариях для загрузки данных следует использовать операции запроса вместо операций вызова. Методы запроса возвращают отдельный объект Entity, объект IQueryable<Entity> или объект IEnumerable<Entity>. Методы запроса являются неотъемлемой частью шаблона данных, поддерживаемого службой DomainService на среднем уровне и DomainContext на клиенте. Платформа Службы RIA создает в клиентском проекте сущности только для сущностей, возвращенных из методов запроса в DomainService.

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

Соглашения

При добавлении методов для выполнения этих операций метод должен соответствовать ожидаемой сигнатуре для соответствующей операции. Помимо соответствия сигнатуры, метод должен содержать префикс имени, соответствующий соглашению об именах для нужной операции с данными. Если имя метода не начинается с ожидаемого префикса, необходимо применить соответствующий атрибут для этой операции. Атрибут является необязательным, если имя операции соответствует соглашению об именах. Использование соглашения об именах позволяет сделать процесс разработки более согласованным.

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

Можно запретить предоставление того или иного метода, добавив к нему атрибут IgnoreAttribute.

Сигнатуры операций с данными предоставлены в следующих таблицах.

Запрос

Метод запроса должен возвращать одиночный экземпляр сущности, IEnumerable или IQueryable, где T — допустимый тип сущности. Так как перегружаемые методы запрещены, необходимо указать уникальное имя для каждого метода, принимающего разные входные параметры (например, GetEmployees() и GetEmployeesByLastName(string lastname).

В следующей таблице перечислены ожидаемые значения сигнатур для операции запроса.

Возвращаемое значение

IEnumerable<T>, IQueryable<T> или сущность

Параметры

Любое число параметров

Префикс имени

Любое имя

Атрибут

[Query] (C#)

— или —

<Query()> (Visual Basic)

Дополнительные сведения см. в разделе QueryAttribute.

Пример

public IQueryable<Product> GetProducts() (C#)

— или —

Public Function GetProducts() As IQueryable(Of Product) (Visual Basic)

Обновление

В следующей таблице перечислены ожидаемые значения сигнатур для операции обновления.

Возвращаемое значение

Нет

Параметры

Сущность

Префикс имени

Update, Change или Modify

Атрибут

[Update] (C#)

— или —

<Update()> (Visual Basic)

Дополнительные сведения см. в разделе UpdateAttribute.

Пример

public void UpdateProduct(Product product) (C#)

— или —

Public Sub UpdateProduct(ByVal product As Product) (Visual Basic)

Вставка

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

Возвращаемое значение

Нет

Параметры

Сущность

Префикс имени

Insert, Add или Create

Атрибут

[Insert] (C#)

— или —

<Insert()> (Visual Basic)

Дополнительные сведения см. в разделе InsertAttribute.

Пример

public void InsertProduct(Product product) (C#)

— или —

Public Sub InsertProduct(ByVal product As Product) (Visual Basic)

Удаление

В следующей таблице перечислены ожидаемые значения сигнатур для операции удаления.

Возвращаемое значение

Нет

Параметры

Сущность

Префикс имени

Delete или Remove

Атрибут

[Delete] (C#)

— или —

<Delete()> (Visual Basic)

Дополнительные сведения см. в разделе DeleteAttribute.

Пример

public void DeleteProduct(Product product) (C#)

— или —

Public Sub DeleteProduct(ByVal product As Product) (Visual Basic)

Вызов

Операции вызова предоставляют внештатный механизм для возврата не относящихся к сущностям данных и выполнения операций с побочными эффектами. Дополнительные сведения о побочных эффектах см. в описании свойства HasSideEffects. Операции вызова обычно неуместны для методов запроса.

В следующей таблице перечислены ожидаемые значения сигнатур для операции вызова.

Возвращаемое значение

Любое

Параметры

Любое число параметров

Префикс имени

Любой

Атрибут

[Invoke] (C#)

— или —

<Invoke> (Visual Basic)

Дополнительные сведения см. в разделе InvokeAttribute.

Пример

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

— или —

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal (Visual Basic)

Именованное обновление

В следующей таблице перечислены ожидаемые значения сигнатур для операции именованного обновления.

Возвращаемое значение

Нет

Параметры

Сущность

Любое число других параметров

Префикс имени

Любое имя, за исключением начинающихся с префиксов Insert, Update и Delete

Атрибут

[Update(UsingCustomMethod=true] (C#)

— или —

<Update(UsingCustomMethod:=True)> (Visual Basic)

Дополнительные сведения см. в разделе UpdateAttribute.

Пример

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage) (C#)

— или —

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer) (Visual Basic)

Добавление логики приложения в службу домена

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

При реализации службы домена необходимо внимательно рассмотреть угрозы безопасности из-за предоставления данных через службу. Дополнительные сведения о безопасности см. в разделе Безопасность WCF для служб полнофункционального интернет-приложения.

См. также

Основные понятия

Операции и DomainContext
Безопасность WCF для служб полнофункционального интернет-приложения