2010-11-29 4 views
13

Wir stellen ein Domänenmodell über WCF Data Services zur Verfügung. Das Modell stammt aus EF4 und benötigt einige zusätzliche Arbeit, um es in die erforderliche Form für die Veröffentlichung über den Web-Service zu bringen.Best Practices für die Integration von AutoMapper mit WCF Data Services und EF4

Ich würde gerne außerhalb von EF4 damit umgehen, um unser EDMX auf das Modell und nicht auf dessen Nutzung zu konzentrieren. Meine Idee ist es, ein maßgeschneidertes "ServiceModel" speziell für den Web-Service zu erstellen, das die dienstspezifischen Anliegen enthält.

Meine Frage ist, wie man Autmapper in der Mitte von WCF Data Services am besten verdrahtet. Ich verwende WCF Data Services mit einem benutzerdefinierten (reflektionsbasierten) Anbieter für die ServiceModels. Wo kann ich die OData-Abfrage (für ServiceModels) in eine EF4-Abfrage (für DomainModels) konvertieren und die Ergebnisse an ServiceModels zurückmelden?

Antwort

21

Ich verwende Automapper in meinen WCF-Services, um von Datenbank-Entities zu Datenverträgen zu mappen. Für jeden Dienst erstelle ich eine statische AutomapBootstrap-Klasse mit einer Methode zu InitializeMap. Dann dekoriere ich den Dienst für jeden Dienst mit einem AutomapServiceBehavior-Attribut.

Ich weiß nicht, ob dies für Ihr Szenario funktioniert, da WCF Data Services ein wenig anders ist als WCF-WCAP-SOAP-Dienste und -Dienste, die WCF-Webbindungen verwenden.

Allerdings ist es einen Blick wert.

Dies ist der Dienst Verhalten

[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 
} 

Das ist mein Mapper

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()); 

    } 
} 

das ist, wie ich meinen Dienst verdrahten Automap

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

Schlussbemerkung: Mein Dienst ist ein WCF-Dienst von Vanilla, der WebBinding verwendet und Daten im Stil von REST ausliefert.

+0

Sehr nützliches Code-Snippet, könnte besser gemacht werden, wenn Sie die erforderlichen Namespaces einschließen könnten - es dauerte länger, um diese herauszufinden, als den Code zu verstehen. – Chris

+0

Welche Objekte/Namespaces waren am verwirrendsten? – CedricB

+0

Die erforderlichen Namespaces sind System.ServiceModel, System.ServiceModel.Channels, System.ServiceModel.Description und System.Collections.ObjectModel. –

0

Sofern Ihr Domänenmodell nicht sehr einfach und sehr flach (sehr wenige Sammlungen darin) ist, würde ich vorschlagen, von Ihren Domain-Objekten zu projizieren, um Ihre Service (DTO) Schicht zu erstellen.

Stattdessen würde ich Ihre DTOs direkt von Ihrem Datenspeicher (DB) projizieren. Wenn Sie dies nicht tun, werden viele SELECT N + 1-Probleme auftreten und die Wartung wird teurer, als wenn Sie Ihre DTOs direkt von Ihren Datenbanktabellen aus hydratisieren.

Verwandte Themen