Automapper - какой-то статический класс внутри проекта? - PullRequest
0 голосов
/ 08 октября 2018

Я пишу какое-то приложение Web API, где у меня есть 4 основных уровня - API, BusinessLogic (который я называю BusinessServices), DAL (который использует EF для общения с базой данных) и EntitiesData (где у меня есть мои сущности).

API вызывает businessService, bs спрашивает DAL, DAL с помощью EF запрашивает базу данных о моих EntitiesData.

Хорошо, теперь в чем проблема;)

На BusinessServices я хочуотобразить сущности в некоторый DTO, который я могу вернуть в API.Я хотел использовать AutoMapper, но на уроках есть очень простые примеры, которые я понимаю.

Первый вопрос: я должен использовать 2 контейнера IoC?Или, может быть, перенести мой IOC из API на уровень бизнес-сервисов?Первый контейнер находится на уровне API и содержит BusinessServices (например, UsesrsService, MessageService и т. Д.). Второй контейнер находится на уровне BusinessServices - я хочу использовать его для хранения карт AutoMapper.

И это второйВопрос - что мне делать с AutoMapper.Я знаю, как создать конфигурацию, вот так:

private void Congifure()
{
    if(!(configuration == null))
        return;

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<User, UserDto>();
        cfg.CreateMap<Message,MessageDto>();
    });
}

но что мне теперь делать?упаковать его в контейнер IoC?Из какого места в коде я должен назвать мой класс, который настраивает mapper?В businessServices у меня есть только мои классы бизнес-логики и DTO.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

самое первое в документах autopper говорит об инициализации.Это следует делать везде, где вы загружаете свой контейнер IOC.

Вам нужен только 1 контейнер IOC, из-за чего 2 сделает их бесполезными, поскольку вы разбили бы дерево зависимостей на 2 половины.

И вам следует рассмотреть возможность использования профилей отображения для ваших разных слоев.

0 голосов
/ 08 октября 2018

Вы можете упаковать его в свой метод Startup.cs ConfigureServices:

var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<User, UserDto>();
                cfg.CreateMap<Message,MessageDto>();
            });
var mapper = config.CreateMapper();
services.AddScoped<AutoMapper.IMapper>(c => mapper);

А затем внедрить его в ваши классы:

public class MyService
{
    public MyService(IMapper mapper)
    {
        ...
    }
}

Я бы использовал один картограф и поместил егогде-то вертикально к вашему слою, как в проекте "помощников".Ваш маппер должен отображать между разными слоями, поэтому он должен находиться между ними.Просто перенесите логику создания MapperConfiguration в отдельный проект и вызовите его из вашего Startup.cs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...