Transcript
Page 1: RIA services exposing & consuming queries

Week 7 – WCF RIA Services

Overview

Jim LaVinejim.lavine @gmail.com

Page 2: RIA services exposing & consuming queries

Remaining Schedule• 1-8 Exposing and consuming querying services• 1/15 Updating data• 1/22 Business Logic and validation

Page 3: RIA services exposing & consuming queries

Agenda• Domain query rules• The DomainContext Class• Asynchronous loading• Client-side data caching• Shaping data in the client• Retrieving object hierarchies• A peak under the hood

Page 4: RIA services exposing & consuming queries

Domain Service

Design-time workflow

Domain Service

Data model

MetadataEntityMetadataEntity

MetadataEntity

DAL

L2S EF REST/SOAP POCO

Server project

CRUD

Custom logic

Client project

Domain Context

MetadataEntity proxy typeMetadataEntity proxy type

MetadataEntity proxy type

UI Views

Entity Container

Load

Invoke

Build

1

2

4

3

Bindable

Page 5: RIA services exposing & consuming queries

Domain query operation rules [EnableClientAccess()] public class ChinookDomainService : LinqToEntitiesDomainService<ChinookEntities> { public IEnumerable<Invoice> GetInvoiceByCustomer(int customerId) { return ObjectContext.Invoices.Where(c => c.CustomerId == customerId); }

public Customer GetCustomerById(int customerId) { return ObjectContext.Customers.Where(c => c.CustomerId == customerId); } }

public

IEnumerableIQueryable

<T>

Entity

Supportedtypes

public IEnumerable<Customers> GetCustomersByJoinData(DateTime mindate, DateTime maxdate)

{ return ObjectContext.Customers.Where(c => c.JoinDate >= mindate &&

c.JoinDate <= maxdate); }

NoOverloads

Page 6: RIA services exposing & consuming queries

public class Customers { [Key] public int CustomerId { get; set; } public string FName { get; set; } . . . }

Domain query operation rules

Identity

Page 7: RIA services exposing & consuming queries

Convention vs. configuration• Query operation explicit marking : QueryAttribute• Signature match : returns IQueryable<T>, IEnumerable<T>, T• QueryAttribute parameters

– IsComposable– ResultLimit– HasSideEffects

[Query] public Iqueryable<Customers> GetCustomersByState (BillingState state) { . . . }

public Iqueryable<Customers> GetCustomersByState (BillingState state) { . . . } [Query (IsComposable=false)] public SalesPerson GrabTopSalesperson (int year) { . . . }

Page 8: RIA services exposing & consuming queries

Demo• Defining domain queries

Page 9: RIA services exposing & consuming queries

Code generation

l

Server assemblies Silverlight Client

Entity type

Custom Attribute

Silverlight client

Entity type

Entity type

Metadata class

Entity proxy

Custom Attribute

DomainContext types

Query factory methods

Entity proxy

Entity proxy

Namespace

Class name

Public props

InotifyPropertyChangedValidationMetadata

NamespaceDomainService types[EnableClientAccess]

Public methods

Page 10: RIA services exposing & consuming queries

The typed DomainContext class

• Constructors• Query proxy methods• Entity proxy properties• Entity container factory

Page 11: RIA services exposing & consuming queries

Demo• Examining generated classes

Page 12: RIA services exposing & consuming queries

Asynchronous loading

ChinookDomainContext ctx = new ChinookDomainContext();

var query = ctx.GetInvoicesByCustomer (1) ; LoadOperation<Invoice> op = ctx.Load(query);

CustomerGrid.ItemsSource = op.Entities

EntityQuery<Invoice>

LoadOperation<Invoice>

IEnumerable<Invoice>

Page 13: RIA services exposing & consuming queries

The Load methodLoad method overloads• Load(EntityQuery<TEntity>)• Load(EntityQuery<TEntity>, LoadBehavior, Callback, UserState)• Load(EntityQuery<TEntity>, Callback, UserState)• Load(EntityQuery<TEntity>, ThrowOnError)• Load(EntityQuery<TEntity>, LoadBehavior, ThrowOnError)

LoadOperation<Invoice> op = ctx.Load<Invoice>(query,lo => { /* Check for errors, bind to UI, do work */},null);

ctx.Load<Invoice>(query).Completed += new EventHandler(LoadComplete);

void LoadComplete(object sender, EventArgs e){/* Check for errors, bind to UI, do work */ }

Page 14: RIA services exposing & consuming queries

LoadOperation

Load Operation: AllEntities Entities EntityQuery TotalEntityCount

OperationBase: INotifyPropertyChanged IsComplete, Completed,

event Cancel(), CanCancel,

IsCanceled Error, HasError

Page 15: RIA services exposing & consuming queries

Demo• Loading data

Page 16: RIA services exposing & consuming queries

Caching query results

DomainContext

DomainService

EntityContainer

EntitySet Entity

Set EntitySet

EntityEntity

Entity

Change trackingValidationData bindingUpdating

Sendquery

QueryResults

QueryResults

INotifyPropertyChanged

EntitySetpropertyLoad()

Page 17: RIA services exposing & consuming queries

Demo• Binding to cached data

Page 18: RIA services exposing & consuming queries

Load options

Entity Container

EntitySet

Changes (local)Changes (remote)

?

LoadBehavior:

-KeepCurrent-MergeIntoCurrent-RefreshCurrent

Load()

Page 19: RIA services exposing & consuming queries

Demo• Using LoadBehavior

Page 20: RIA services exposing & consuming queries

Client side data shaping

EntityQuery<T>e.g. GetProductsQuery()

QueryNameParametersQueryIsComposable

LINQ operators(Where, Skip,Take, OrderBy)

EntityQueryable(extension)

DomainService

Client

Server

Server query +Client-side querycombined

LINQ operators(Where, Skip,Take, OrderBy)

Page 21: RIA services exposing & consuming queries

Demo• Filtering data

Page 22: RIA services exposing & consuming queries

Retrieving object hierarchies

Server

Server-sideEntity type

[IncludeAttribute]

MetadataClass

Domain ServiceIQuerable<foo>

GetFoos()

Include

foo1

Client

EntityContainer

foo1 [Association]new props

Page 23: RIA services exposing & consuming queries

Demo• Returning related data

Page 24: RIA services exposing & consuming queries

A look behind the scenes

DomainContext

DomainService

WebDomain Client

BeginQuery()

WCF Channel Factory

WCF Client Channel

WCF ServiceContract DomainServic

eHttpModule

Virtual.SVC file<%@ServiceHost

Service=“XYZService Factory=“System.Web.Ria.

DomainServiceHostFactory”%>

WCF ServiceContract

DomainService

HostFactory

DomainServiceHost

Operation Description

QueryResult<T>

REST/binary endpoint

Page 25: RIA services exposing & consuming queries

Summary

• Integrated Infrastructure• Signature-based conventions• Metadata-specific object heirarchies• Simplified asynchronous calls• Client-side data caching• Integrateing data shaping• REST-based default configuration