Как мне внедрить конфигурацию автоматического отображения в мою модель обслуживания

#c# #asp.net-core #automapper

Вопрос:

У меня есть строка в моем Asp.Net Основной API Startup.cs :

 services.AddAutoMapper(Assembly.GetExecutingAssembly());
 

С помощью этого я могу использовать _mapper.Карта, потому что я внедряю ее в свою модель обслуживания. Я пытаюсь преобразовать в use .ProjectTo() . Он хочет MapperConfiguration . Как мне ввести это, чтобы мне не нужно было создавать это в каждом методе?

Мой текущий метод:

     public async Task<IEnumerable<EcommerceItemDto>> GetAllItemsUsingProjectToAsync(string customerNumber, string category = "All",
        int page = 0, int pageSize = 9999)
    {
        IQueryable<Category> categories;

        if (category == "All")
        {
            categories = _context.Categories
                .Include(c => c.Children)
                .Include(p => p.Parent)
                .AsNoTrackingWithIdentityResolution();
        }
        else
        {
            categories = _context.Categories
                .Where(n => n.Name == category)
                .Include(c => c.Children)
                .Include(p => p.Parent)
                .AsNoTrackingWithIdentityResolution();
        }

        var configuration = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<EcommerceItem, EcommerceItemDto>();
                cfg.CreateMap<EcommerceItemImages, EcommerceItemImagesDto>();
                cfg.CreateMap<Category, CategoryDto>();
            });

        var dto = await _context.EcommerceItems
            .FromSqlInterpolated($"SELECT * FROM [cp].[GetEcommerceItemsView] WHERE [CustomerNumber] = {customerNumber}")
            .Include(x => x.Category)
            .Include(i => i.Images.OrderByDescending(d => d.Default))
            .OrderBy(i => i.ItemNumber)
            .Where(c => categories.Any(x => x.Children.Contains(c.Category)) || categories.Contains(c.Category))
            .Skip(page * pageSize)
            .Take(pageSize)
            .AsNoTracking()
            .ProjectTo<EcommerceItemDto>(configuration)
            .ToListAsync();

        return dto;
    }
 

Ответ №1:

Для начала я бы посоветовал вам использовать файлы профилей для настройки сопоставлений

 public class SampleProfile : Profile
{
    public OrganizationProfile()
    {
        CreateMap<Foo, FooDto>();
        
    }
}
 

А затем, как только вы предоставите сборку с помощью метода IServiceCollection.AddAutoMapper() расширения, она будет сканировать сборку и извлекать конфигурации из файлов профилей.

 services.AddAutoMapper(Assembly.GetExecutingAssembly());
 

Еще документация здесь и Пакет Github

Файл профиля также помогает лучше организовать конфигурации отображения (в собственных файлах, чем смешивать вещи).

Теперь вы могли бы использовать

 var orders = await dbContext.EcommerceItems
                       // rest of query
                       .ProjectTo<EcommerceItemDto>(_mapper.ConfigurationProvider)
                       .ToListAsync();
 

Комментарии:

1. Или используйте IMapper.ProjectTo вместо метода расширения.