将AutoMapper与WCF数据服务和EF4集成的最佳实践

STW*_*STW 13 .net c# automapper entity-framework-4 wcf-data-services

我们通过WCF数据服务公开域模型.该模型源自EF4,需要一些额外的工作才能使其成为通过Web服务发布所需的形式.

我想在EF4之外处理这个问题,以使我们的EDMX专注于模型,而不是它的用法.我的想法是创建一个专门用于Web服务的自定义"ServiceModel",并包含特定于服务的问题.

我的问题是如何在WCF数据服务中间最好地连接自动播放器.我正在使用WCF数据服务与ServiceModel的自定义(基于反射)提供程序.我在哪里可以将OData查询(对于ServiceModels)转换为EF4查询(对于DomainModels),并将结果映射回ServiceModels?

Ced*_*icB 22

我在WCF服务中使用Automapper从数据库实体映射到数据协定.对于每个服务,我使用InitializeMap的方法创建一个静态AutomapBootstrap类.然后,对于每个服务,我使用AutomapServiceBehavior属性修饰服务.

我不知道这是否适用于您的场景,因为WCF数据服务与使用WCF WebBindings的vanilla WCF SOAP服务和服务略有不同.

不过,值得一看.

这是服务行为

[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
}
Run Code Online (Sandbox Code Playgroud)

这是我的映射器

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

    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我将服务连接到automap的方法

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

最后说明,我的服务是一个使用WebBinding的vanilla WCF服务,并以REST风格的方式提供数据.

  • 请注意,AddBindingParameter方法针对为您的服务配置的每个Listen uri运行.来自MSDN:"对于每个侦听URI调用此方法一次.例如,如果服务有四个端点,并且其中两个具有相同的侦听URI,则此方法将被调用三次". (2认同)