Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

WCF RIA Services. Приобретение данных. Часть 2

Anna | 17.06.2014 | нет комментариев

Всеобщие данные

В первой части мы ознакомились, что за зверь такой WCF RIA Services, и сделали приложение, которое дозволено коротко назвать, как «Hello world». Все было дюже легко, прекрасно, а так же «drag and drop». Впрочем для создания настоящих, крупных и функциональных приложений необходимо еще много чего выучить, скажем какие вероятности доступны в клиентской части, и как их применять. В этом уроке мы копнем немного глубже в области приобретения данных на клиентской стороне. Так же Вы узнаете о конвенциях, которые применяются для способов, получающих данные, определенные в серверной части, как их настраивать, применяя признаки. Расскажу о некоторых программных реализациях, которые дозволено применять для приобретения данных на стороне заказчика и как применять данные, которые применяют хорошие от Entity Framework источники.

Исходной точкой для постижения каждого вышесказанного является план, тот, что был сделан в предыдущей, первой части.

Шаг 1: Добавление в доменную службу параметризованного запроса

Позже того, как мы сотворили службу домена в предыдущем уроке, она имела такой вид:

public IQueryable<Task> GetTasks()
 {
     return this.ObjectContext.Tasks;
 }

Данный способ возвращает все записи из таблицы Tasks как перечислимый тип IQueryable и не принимает доводов. Если же появляется надобность получить на стороне заказчика больше особенный запрос, то нужно добавить способ в службу домена, тот, что в свою очередь будет механически доступен заказчику. Так же есть вероятность возвращать данные типа IEnumerable, но если стержневой подрядчик данных (Entity Framework либо LINQ to SQL) возвращает IQueryable, то это необходимо будет реализовать отдельно.

Теперь модернизируем наше приложение таким образом, что б добавить вероятность получать события в заданном диапазоне дат. Для этого в службу домена добавьте дальнейший код:

public IQueryable<Task> GetTasksByStartDate(
     DateTime lowerDateTimeInclusive, 
     DateTime upperDateTimeInclusive)
 {
     return this.ObjectContext.Tasks.Where(
         t => t.StartDate >= lowerDateTimeInclusive && t.StartDate <= upperDateTimeInclusive);
 }

 

Шаг 2: Метаморфозы UI для приобретения конкретизированных данных.

Для этого нужно добавить несколько элементов на нашу страницу. Откройте MainPage.xaml. Сместите Grid таким образом, что б над ним было свободное место для добавления элементов. С поддержкой «Drag and drop» добавьте из Панели инструментов два TextBox и один Button. Дайте имена сделанным элементам, соответственно: lowerDate, upperDate, searchButton.

Измените Content кнопки на «Search By Date».

Шаг 3: Приобретение итога запроса на заказчике, применяя DomainContext

Как Вы помните, DomainContext – это автогенерируемый код, тот, что представляет отражение вероятностей серверной части приложения. То есть, если сервис домена именуется TasksDomainService, то клиентская часть приложения именуется TasksDomainContext. Он предоставляет вероятность обращаться к серверной части в асинхронном режиме, а так же сберегать метаморфозы, которые были внесены на клиентской стороне.

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

Добавьте на только что сделанную кнопку событие «Click». А в обработчик этого события добавьте дальнейший код:

private void searchButton_Click(object sender, RoutedEventArgs e)
 {
     DateTime lowerDateVal;
     DateTime upperDateVal;
     GetDates(out lowerDateVal, out upperDateVal);

     TasksDomainContext context = new TasksDomainContext();
     taskDataGrid.ItemsSource = context.Tasks;
     EntityQuery<Task> query = context.GetTasksByStartDateQuery(lowerDateVal, upperDateVal);
     LoadOperation<Task> loadOp = context.Load(query);
 }

Обратить внимание следует на последние 4 строчки кода, так как первые 3 – легко приобретение введенной даты из соответствующих полей, и выглядит дальнейшим образом:

        private void GetDates(out DateTime lowerDateVal, out DateTime upperDateVal)
        {
            lowerDateVal = DateTime.MinValue;
            upperDateVal = DateTime.MaxValue;
            if (!string.IsNullOrWhiteSpace(lowerDate.Text))
            {
                lowerDateVal = DateTime.Parse(lowerDate.Text);
            }
            if (!string.IsNullOrWhiteSpace(upperDate.Text))
            {
                upperDateVal = DateTime.Parse(upperDate.Text);
            }
        }

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

Контекст домена предоставляет коллекции сущностей, которые в свою очередь включают в себя комплекты коллекций, возвращаемых доменом обслуживания позже отработки запросов. На данном этапе домен обслуживания предоставляет только коллекцию данных из таблицы Tasks.

Обратите внимание, что данный код заменяет ItemsSource в DataGrid коллекцией Tasks до того, как производится какой либо запрос на приобретение данных. Так необходимо в силу того, что запросы, отправляемые контекстом домена являются асинхронными, и заменят содержимое коллекции лишь позже прихода результата от сервера. Данная коллекция реализует интерфейс INotifyCollectionChanged и способна вызывать события, направленные на DataGrid (либо всякий связанный элемент) для обновления его содержимого.

После этого идет приобретение EntityQuery от контекста с доводами, которые передаются в соответствующий способ на сервере. То есть здесь мы указываем, что бы мы хотели получить, но вызов еще не происходит. И наконец-то происходит приобретение LoadOperation от контекста, путем вызова способа Load. Вот здесь теснее происходит непринужденно обращение к серверу в теневом потоке, а когда запрос выполниться на сервере и придет результат с нужными данными — в потоке UI механически обновится каждая информация на актуальную.

В тезисе, это тоже самое, что происходит под покровом DomainDataSource из первого урока.

Шаг 4: Добавление способа, возвращающего исключительный объект

Чтоб способ не возвращал коллекцию, его надобного так и объявить. Дальше, позже компиляции он будет так же доступен и на стороне заказчика:

public Task GetTask(int taskId)
 {
     return this.ObjectContext.Tasks.FirstOrDefault(t => t.TaskId == taskId);
 }

 

Конвенция о настройках

Есть такая склонность в. NET программировании, когда уменьшается число кода, нужного очевидно прописывать для обеспечения надобных настроек, впрочем доводиться следовать некоторым правилам именования. Допустимо Вы этого еще не подметили, бегло просматривая код службы домена, впрочем там теснее это используется. Это не дюже видимо на способах, которые извлекают данные, так как способ с любым наименованием будет отрабатывать идентично отлично. Впрочем для операций обновления, удаления и создания необходимо придерживаться определенных правил, базируясь на которых WCF RIA Services ищет и исполняет надобные способы, скажем, такие как UpdateTask, InsertTask, DeleteTask. Допустимо указание нескольких вариантов для всякой операции.

И не забывайте про вероятности настройки применяя признаки. Скажем для стороны осуществляющей запросы, декорировать способы дозволено признаком [Query], что сделает Ваш код больше читабельным и легким для понимания. Необходимо помнить, что и тип возвращаемого значения тоже многое говорит о назначении способа. Скажем, способ возвращающий IQueryable, IEnumberable — однозначно отвечает за извлечение данных. Впрочем преобладание применения признака Query еще в том, что он поддерживает еще некоторые добавочные параметры, такие как наивысшее число возвращаемых итогов, которые ограничит их число, даже если из БД вернется позже запроса огромнее нужного.

Пользовательские доменные службы

А что делать, если Вы не хотите применять Entity Framework? Как вариант дозволено воспользоваться LINQ to SQL. Я бы советовал применяться Entity Framework с новыми планами. И по вероятности со ветхими.

LINQ to SQL поддерживается в WCF RIA Services через Toolkit.

Впрочем многие применяют другие стратегии доступа к данным, скажем nHibernate и другие источники данных, такие как Oracle, MySQL и многие другие. Все это дозволено так же применять в WCF RIA Services, но необходимо определить объекты данных как примитивные сущности и применять их дальше в коде как сочтете необходимым.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB