Создание бизнес-приложений Silverlight с использованием .NET RIA сервисов
Класс DomainService
Создание класса DomainService на уровне бизнес-логики - ключевой момент при использовании .NET RIA сервисов. DomainService - это класс, который содержит сущности и операции. В нем же реализуется бизнес-логика приложения. В рамках .NET RIA сервисов содержится программный код, который делает сущности и операции доступными другим уровням приложения.
Процесс создания класса DomainService показано на Рис. 4.12. Данный класс лежит в пространстве имен System.Web.DomainServices.
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; …
После компиляции и запуска можно увидеть результат.
Выводы
Ключевыми моментами использования .NET RIA сервисов и Silverlight являются:
- Стандартное приложение Silverlight может быть легко преобразовано в многоуровневое с помощью установления связки "RIA link" между проектом Silverlight и веб-проектом.
- Простейшая форма многоуровневого приложения состоит из двух отдельных проектов внутри одного решения, один проект - ASP.NET веб-приложение (бизнес логика, средний уровень), другой - приложение Silverlight (клиент).
- Класс DomainService содержит набор сущностей и операций. Разработчикам следует располагать программный код с логикой приложения именно в этом классе.
- При компиляции приложения генерируется прокси-класс на клиенте Silverlight, прокси-класс содержит помеченные атрибутом EnableClientAccess сущности класса DomainService.
- Код клиента Silverlight взаимодействует с прокси-классом DomainContext, чтобы получать и манипулировать сущностями
- И сервер и клиент взаимодействуют с общим набором сущностей, делая возможным использовать одну и ту же бизнес-логику и правила ввода текста всеми уровнями многоуровневого приложения.