Рекомендации по интеграции AutoMapper с службами данных WCF и EF4

Мы размещаем модель домена через службы данных WCF. Модель взята из EF4 и требует дополнительной работы, чтобы получить ее в требуемой форме для публикации через веб-службу.

Я бы хотел обработать это за пределами EF4, чтобы наш EDMX фокусировался на модели, а не на ее использовании. Моя идея - создать настраиваемый "ServiceModel", который специально предназначен для веб-сервиса, и содержит проблемы, связанные с обслуживанием.

Мой вопрос заключается в том, как лучше всего подключить автомастер в середине служб данных WCF. Я использую службы данных WCF с помощью специального (основанного на отражении) поставщика для ServiceModels. Где можно преобразовать запрос OData (для ServiceModels) в запрос EF4 (для DomainModels) и отобразить результаты на ServiceModels?

Ответы

Ответ 1

Я использую Automapper в своих WCF-сервисах для сопоставления сущностей базы данных с контрактами данных. Для каждой службы я создаю статический класс AutomapBootstrap с методом InitializeMap. Затем для каждой службы я украшаю службу атрибутом AutomapServiceBehavior.

Я не знаю, будет ли это работать для вашего сценария, потому что службы данных WCF немного отличаются от сервисов и сервисов 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());

    }
}

вот как я подключаю свою службу к automap

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

Заключительное примечание: моя служба - ванильная служба WCF, использующая WebBinding и обслуживающие данные в стиле REST.

Ответ 2

Если ваша модель домена очень простая и очень мелкая (в ней очень мало коллекций), я бы предложил против проецирования объектов вашего домена на создание уровня сервиса (DTO).

Скорее, я буду проектировать ваши DTO непосредственно из вашего хранилища данных (DB). Невыполнение этого требования приведет к возникновению многих проблем SELECT N + 1 и в конечном итоге будет более дорогостоящим, чем просто увлажнение ваших DTO непосредственно из таблиц базы данных.