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

标签 c# .net entity-framework-4 automapper wcf-data-services

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

我想在 EF4 之外处理这个问题,以使我们的 EDMX 专注于模型而不是它的使用。我的想法是创建一个定制的“服务模型”,它专门用于网络服务并包含特定于服务的问题。

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

最佳答案

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

我不知道这是否适用于您的方案,因为 WCF 数据服务与普通 WCF SOAP 服务和使用 WCF WebBindings 的服务略有不同。

不过,还是值得一看。

这是服务行为

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

这是我的映射器

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

    }
}

这就是我将服务连接到自动 map 的方式

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

最后一点,我的服务是使用 WebBinding 并以 REST 风格提供数据的普通 WCF 服务。

关于c# - 将 AutoMapper 与 WCF 数据服务和 EF4 集成的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307318/

相关文章:

c# - 如果说话者远离麦克风,Google Speech/NAudio 会有很大的延迟

.NET 远程处理线程模型

c# - 无法将发布值从 ajax 传递到 .net c# 中的页面

c# - 如何删除 HTML 标签中的所有属性

java - Java 通配符泛型 <?> 的 .NET 等效项具有协方差和逆方差?

linq-to-sql - .net 4.0 运行时是否适用于 SQL Server 2000?

.net - ORACLE 和 Entity Framework 。错误 :the specified store provider cannot be found in the configuration or is not valid

c# - 不变性和静态变量

C# 将 int 转换为 Int64

.net - 在 EntityObject 中的自定义属性上引发 PropertyChanged