2010-11-29 19 views
13

Estamos exponiendo un modelo de dominio a través de WCF Data Services. El modelo se origina en EF4, y requiere un trabajo adicional para obtenerlo en la forma requerida para ser publicado a través del servicio web.Mejores prácticas para integrar AutoMapper con WCF Data Services y EF4

Me gustaría manejar esto fuera de EF4, para mantener nuestro EDMX centrado en el modelo en lugar de su uso. Mi idea es crear un "ServiceModel" personalizado que sea específicamente para el servicio web y que contenga las preocupaciones específicas del servicio.

Mi pregunta es cómo mejorar la automatización de los cables en medio de los servicios de datos de WCF. Estoy utilizando WCF Data Services con un proveedor personalizado (basado en la reflexión) para ServiceModels. ¿Dónde puedo convertir la consulta OData (para ServiceModels) en una consulta EF4 (para DomainModels) y asignar los resultados a ServiceModels?

Respuesta

21

Utilizo Automapper en mi WCF Services para mapear desde entidades de bases de datos a contratos de datos. Para cada servicio, creo una clase estática de AutomapBootstrap con un método para InitializeMap. Luego, para cada servicio, decorar el servicio con un atributo AutomapServiceBehavior.

No sé si esto funcionará para su escenario porque WCF Data Services es un poco diferente de los servicios y servicios vainilla WCF SOAP usando WCF WebBindings.

Sin embargo, vale la pena mirar.

Este es el comportamiento en servicio

[CoverageExclude(Reason.Framework)] 
public sealed class AutomapServiceBehavior : Attribute, IServiceBehavior 
{ 
    public AutomapServiceBehavior() 
    { 
    } 

    #region IServiceBehavior Members 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
     Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 
     AutomapBootstrap.InitializeMap(); 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 
    } 

    public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 
    } 

    #endregion 
} 

Este es mi asignador

public class AutomapBootstrap 
{ 
    public static void InitializeMap() 
    { 
     Mapper.CreateMap<CreateBookmarkRequest, TagsToSaveRequest>() 
      .ForMember(dest => dest.TagsToSave, opt => opt.MapFrom(src => src.BookmarkTags)) 
      .ForMember(dest => dest.SystemObjectId, opt => opt.UseValue((int)SystemObjectType.Bookmark)) 
      .ForMember(dest => dest.SystemObjectRecordId, opt => opt.Ignore()); 

    } 
} 

así es como puedo conectar mi servicio a AutoMAPA

[AutomapServiceBehavior] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Clouds : ICloudService 
{ 
    // service operation implementation details elided 
} 

Nota final, mi servicio es un servicio de WCF de vanilla que utiliza los datos de WebBinding y que sirven en un estilo de estilo REST.

+0

Fragmento de código muy útil, podría mejorarse si pudiera incluir los espacios de nombres necesarios. Me llevó más tiempo descubrirlos que comprender el código. – Chris

+0

¿qué objetos/espacios de nombres fueron los más confusos? – CedricB

+0

Los espacios de nombres necesarios son System.ServiceModel, System.ServiceModel.Channels, System.ServiceModel.Description y System.Collections.ObjectModel –

0

A menos que su modelo de dominio sea muy simple y muy superficial (muy pocas colecciones dentro de él), le sugiero que no proyecte fuera de los objetos de su dominio para construir su capa de servicio (DTO).

Más bien, proyectaría sus DTO directamente desde su almacén de datos (DB). De lo contrario, se producirán muchos problemas SELECT N + 1 y terminará siendo más costoso de mantener que simplemente hidratando sus DTO directamente de las tablas de la base de datos.

Cuestiones relacionadas