private static OperationDescription CreateQueryOperationDescription(ContractDescription declaringContract, DomainOperationEntry operation) { OperationDescription operationDesc = ServiceUtility.CreateOperationDescription(declaringContract, operation); // Change the return type to QueryResult<TEntity>. operationDesc.Messages[1].Body.ReturnValue.Type = typeof(QueryResult <>).MakeGenericType(operation.AssociatedType); return(operationDesc); }
// Populates a contract description from a domain service description. public static void LoadContractDescription(ContractDescription contractDesc, DomainServiceDescription domainServiceDescription) { bool isMutable = false; OperationDescription operationDesc; Type queryOperationType; Dictionary <Type, Type> queryOperationTypes = new Dictionary <Type, Type>(); foreach (DomainOperationEntry operation in domainServiceDescription.DomainOperationEntries) { switch (operation.Operation) { case DomainOperation.Insert: case DomainOperation.Update: case DomainOperation.Custom: case DomainOperation.Delete: isMutable = true; break; case DomainOperation.Query: operationDesc = ServiceUtility.CreateQueryOperationDescription(contractDesc, operation); if (!queryOperationTypes.TryGetValue(operation.AssociatedType, out queryOperationType)) { queryOperationType = typeof(QueryOperationBehavior <>).MakeGenericType(operation.AssociatedType); queryOperationTypes.Add(operation.AssociatedType, queryOperationType); } operationDesc.Behaviors.Add((IOperationBehavior)Activator.CreateInstance(queryOperationType, operation)); contractDesc.Operations.Add(operationDesc); break; case DomainOperation.Invoke: operationDesc = ServiceUtility.CreateOperationDescription(contractDesc, operation); operationDesc.Behaviors.Add(new InvokeOperationBehavior(operation)); contractDesc.Operations.Add(operationDesc); break; } } if (isMutable) { // Add a SubmitChanges operation. operationDesc = ServiceUtility.CreateSubmitOperationDescription(contractDesc, domainServiceDescription); operationDesc.Behaviors.Add(new SubmitOperationBehavior()); contractDesc.Operations.Add(operationDesc); } ServiceUtility.RegisterSurrogates(contractDesc, domainServiceDescription); }