Настройка Automapper в приложении N-Layer - PullRequest
0 голосов
/ 01 июня 2018

У меня есть приложение N-Layer, как показано ниже

MyApp.Model - содержит edmx и модели данных

MyApp.DataAccess -Репозитории с EF

MyApp.Domain - Доменные / бизнес-модели

MyApp.Services - услуги (библиотека классов)

MyApp.Api - веб-API ASP.NET

Я использую Unity в качестве контейнера IoC и Automapper для отображения OO.

Мой уровень DataAccessссылается на слой модели, который содержит все мои объекты данных.

Я не хочу ссылаться на мой модельный проект в моем слое API.Таким образом, возвращая DomainObjects (бизнес-модели) из сервисного уровня и сопоставляя их с DTO на уровне API (DTO на уровне API).

Я настроил сопоставление domainModel с DTO на уровне API, как показано ниже

public static class MapperConfig
{
    public static void Configure() {
        Mapper.Initialize(
            config => {
                config.CreateMap<StateModel, StateDto>();
                config.CreateMap<StateDto, StateModel>();

                //can't do this as I do not have reference for State which is in MyApp.Model
                //config.CreateMap<State, StateModel>();
                //config.CreateMap<StateModel, State>();
            });
    }
}

Теперь мой вопрос заключается в том, как / где настроить сопоставления автоматического сопоставления для преобразования моих моделей Entity в модели предметной области?

Для этого на уровне API у меня нет ссылки на мой проект модели.Я считаю, что я должен сделать это на уровне обслуживания, но не уверен, как это сделать.Пожалуйста, помогите, как настроить это отображение.

Примечание: Перед тем, как спросить здесь, я погуглил всеми глазами

  1. Где разместить карту AutoMapperрегистрация в ссылочной dll говорит об использовании статического конструктора, который я не считаю хорошим вариантом для добавления во все мои модели (у меня есть 100 моделей), а другой ответ говорит об использовании PreApplicationStartMethod, для которого я должен добавить ссылку на System.web.dll к моим услугам, что не правильно.

  2. https://groups.google.com/forum/#!topic/automapper-users/TNgj9VHGjwg также не ответили на мой вопрос должным образом.

1 Ответ

0 голосов
/ 31 июля 2018

Вам необходимо создать сопоставления профилей в каждом из ваших проектов слоев, а затем указать AutoMapper использовать эти профили в верхнем / внешнем (вызывающем) слое, который ссылается на все нижние слои.В вашем примере:

MyApp.Model

public class ModelMappingProfile : AutoMapper.Profile
{
    public ModelMappingProfile()
    {
        CreateMap<StateModel, StateDto>();
        CreateMap<StateDto, StateModel>();
    }
}

MyApp.Api

public class ApiMappingProfile : AutoMapper.Profile
{
    public ApiMappingProfile()
    {
        CreateMap<State, StateModel>();
        CreateMap<StateModel, State>();
    }
}

MyApp.Services

Mapper.Initialize(cfg => 
{
    cfg.AddProfile<MyApp.Model.ModelMappingProfile>();
    cfg.AddProfile<MyApp.Model.ApiMappingProfile>();
});

или если вы используете контейнер DI (например, SimpleInjector ):

container.RegisterSingleton<IMapper>(() => new Mapper(new MapperConfiguration(cfg => 
{
    cfg.AddProfile<MyApp.Model.ModelMappingProfile>();
    cfg.AddProfile<MyApp.Model.ApiMappingProfile>();
})));
...