Опубликован: 01.03.2010 | Доступ: свободный | Студентов: 957 / 46 | Оценка: 4.38 / 4.31 | Длительность: 09:26:00
Лекция 4:

Создание бизнес-приложений Silverlight с использованием .NET RIA сервисов

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >

Класс DomainService

Создание класса DomainService на уровне бизнес-логики - ключевой момент при использовании .NET RIA сервисов. DomainService - это класс, который содержит сущности и операции. В нем же реализуется бизнес-логика приложения. В рамках .NET RIA сервисов содержится программный код, который делает сущности и операции доступными другим уровням приложения.

Процесс создания класса DomainService показано на Рис. 4.12. Данный класс лежит в пространстве имен System.Web.DomainServices.


Создание класса DomainService

Рис. 4.13. Создание класса DomainService

DataContext - данные класса AdventureWorks_DataEntities, сгенерированного ранее и содержащего методы работы с двумя таблицами Product и ProductInventory из демонстрационной базы данных AdventureWorks. Новый класс DomainService имеет следующие характеристики:

  • Класс происходит из класса LinqToEntitiesDomainService - абстрактного класса .NET RIA Services framework. NET RIA Services framework содержит базовые классы для Entity Framework и LINQ to SQL.
  • Класс привязан к классу данных AdventureWorks_DataEntities.
  • Класс DomainService помечен, как [EnableClientAccess()], чтобы клиентская часть его могла видеть.
  • Был сгенерирован метод GetProduct() для запроса к содержимому объекта Product класса AdventureWorks_DataEntities, т.е. фактически к данным таблицы Product, т.к. только сущность Product помечена галочкой и нет галочки "enable editing".

В этот новый класс DomainService помещается вся бизнес-логика приложения. Например, мы можем изменить метод GetProduct(), чтобы как-то отфильтровать данные. Или можно добавить в этот метод входной параметр для каких-либо целей обработки.

Важным моментом является тот, что класс DomainService имеет публичный интерфейс ( public ) и доступен из других классов. В любом случае новый класс является стартовой точкой для расширения логики приложения. Но при этом сразу получается готовое работающее приложение, отображающее содержимое сущности Product.

Доступ к данным со стороны клиента

После компилирования веб-приложения с каталоге \Generated_Code появляется файл BusinessApplication1.Web.g.cs, содержащий прокси-класс public sealed partial class Product : Entity. Как видно является наследником класса Entity. И повторяет свойства сущностей класса DomainService. Важным аспектом генерации прокси-класса является:

  • Прокси-классы каждый раз генерируются заново, когда модифицируется класс DomainService и компилируется клиентское приложение. Это означает, что нельзя модифицировать этот класс, т.к. он будет перезаписан. Поэтому файл, содержащий класс, имеет атрибут "скрытый файл".
  • Отдельный прокси-класс для клиента генерируется для каждого отдельного класса DomainService
  • Класс DomainContext генерируется на клиенте для обеспечения доступа к операциям класса DomainService. В данном примере генерируется класс ProductContext, который имеет метод GetProductQuery(), который может быть использован как аргумент другого метода DomainContext.Load() , который вызывает метод GetProduct() класса ProductService DomainService, запрашивающий данные из базы данных. Класс DomainContext для каждого класса DomainService на сервере, который помечен атрибутом [EnableClientAccess()]

В примере показано как можно отобразить содержимое сущности Product элементом управления DataGrid. Файл MainPage.xaml содержит данный элемент управления.

<data:DataGrid Name="TheDataGrid"></data:DataGrid>

Файл кода (code behind) MainPage.xaml.cs содержит, следующий код:

using SilverlightApplication1;
using SilverlightApplication1.Web;
using System.Windows.Ria.Data;

namespace SilverlightApplication1
{
  public partial class MainPage : UserControl
  {
    private ProductContext _productContext = new ProductContext();
    public MainPage()
    {
      InitializeComponent();
      LoadOperation<Product> loadOp =                   
                   this._productContext.Load(this._productContext.GetProductQuery());
      this.TheDataGrid.ItemsSource = loadOp.Entities;
      …

После компиляции и запуска можно увидеть результат.

Отображение сущности на клиенте Silverlight

Рис. 4.12. Отображение сущности на клиенте Silverlight

Выводы

Ключевыми моментами использования .NET RIA сервисов и Silverlight являются:

  • Стандартное приложение Silverlight может быть легко преобразовано в многоуровневое с помощью установления связки "RIA link" между проектом Silverlight и веб-проектом.
  • Простейшая форма многоуровневого приложения состоит из двух отдельных проектов внутри одного решения, один проект - ASP.NET веб-приложение (бизнес логика, средний уровень), другой - приложение Silverlight (клиент).
  • Класс DomainService содержит набор сущностей и операций. Разработчикам следует располагать программный код с логикой приложения именно в этом классе.
  • При компиляции приложения генерируется прокси-класс на клиенте Silverlight, прокси-класс содержит помеченные атрибутом EnableClientAccess сущности класса DomainService.
  • Код клиента Silverlight взаимодействует с прокси-классом DomainContext, чтобы получать и манипулировать сущностями
  • И сервер и клиент взаимодействуют с общим набором сущностей, делая возможным использовать одну и ту же бизнес-логику и правила ввода текста всеми уровнями многоуровневого приложения.
< Лекция 3 || Лекция 4: 123456 || Лекция 5 >