AutoMapper ProjectTo<>() не находит картуC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 AutoMapper ProjectTo<>() не находит карту

Сообщение Anonymous »

У меня есть приложение ASP.NET 4.6.2. Я хотел использовать метод ProjectTo() AutoMapper для проецирования результатов из базы данных в мои модели представления.
Я пробовал много тестов, но кажется, что карта невозможно найти только при использовании ProjectTo(). Использование Mapper.Map() в разных местах с одной и той же моделью и моделью представления прекрасно работает.
Я думаю, что-то не так с тем, как AutoMapper работает с моим DI (Autofac), но я не могу понять что.
Startup.Cs

Код: Выделить всё

 public IServiceProvider ConfigureServices(IServiceCollection services)
{
(...)

// Autofac DI
AutofacContainer = AutofacLoader.Configure(services).Build();

return AutofacContainer.Resolve();
}
AutofacLoader.cs

Код: Выделить всё

public static ContainerBuilder Configure(IServiceCollection services)
{
var builder = new ContainerBuilder();

(...)

// AutoMapper
builder.RegisterModule();

if (services != null)
{
builder.Populate(services);

}
return builder;
}
AutoMapperModule.cs

Код: Выделить всё

public class AutoMapperModule : Module
{
protected override void Load(ContainerBuilder builder)
{
var mapping = new MapperConfiguration(cfg =>
{
cfg.AddProfile(new Core.Mappings.AutoMapperProfileConfiguration());
cfg.AddProfile(new Dieet.Core.Mappings.AutoMapperProfileConfiguration());
});
builder.RegisterInstance(mapping.CreateMapper()).As().AutoActivate();
}
}
Тест завершается неудачей из-за «Отсутствует карта от пациента к PatientViewModel». Создайте с помощью Mapper.CreateMap
'.

Код: Выделить всё

   [Fact]
public async void InfohosServiceReturnsPatientViewModels()
{
var db = _container.Resolve();

var search = new PaginatedSearchBase();
search.OrderBy = "Naam";

var mapper = _container.Resolve();

var result = await search.PagedResultAsAsync
(null,db.Patienten,mapper);
}
PaginatedSearchBase

Код: Выделить всё

public class PaginatedSearchBase
{
public string OrderBy { get; set; }
public bool OrderDescending { get; set; }
public int Page { get; set; } = 1;
public int PageSize { get; set; } = 10;
}
И, наконец, расширение, вызывающее ProjectTo

Код: Выделить всё

public static class PagedResultExtensions
{
public static async Task
> PagedResultAsync(this PaginatedSearchBase vm, ICollection whereCollection, IEnumerable context) where T : class
{
int totalCount;
var query = PrepareQuery(vm, whereCollection, context, out totalCount);

return new PagedResult
{
Results = await query.ToListAsync(),
Page = vm.Page,
PageSize = vm.PageSize,
Total = totalCount
};
}
public static async Task PagedResultAsAsync(this PaginatedSearchBase vm, ICollection whereCollection, IEnumerable context, IMapper mapper) where T : class
{
int totalCount;
var query = PrepareQuery(vm, whereCollection, context, out totalCount);

return new PagedResult
{
----------> Results = await query.ProjectTo(mapper).ToListAsync(),
Page = vm.Page,
PageSize = vm.PageSize,
Total = totalCount
};
}

private static IQueryable PrepareQuery(PaginatedSearchBase vm, ICollection whereCollection, IEnumerable context,
out int totalCount) where T : class
{
var query = context.AsQueryable();
if (whereCollection != null)
{
foreach (var w in whereCollection)
{
if (w != null)
{
query = query.Where(w);
}
}
}
// Order by
query = query.OrderBy($"{vm.OrderBy} {(vm.OrderDescending ? "DESC" : "ASC")}");

// Total rows
totalCount = query.Count();

// Paging
query = query.Skip((vm.Page - 1)*vm.PageSize).Take(vm.PageSize);
return query;
}
}
Для информации, я использую версии:
  • "Autofac": "4.0.0-rc1-177 "
  • "Autofac.Extensions.DependencyInjection": "4.0.0-rc1-177"
    "AutoMapper": "4.2.1"< /li>
Новый тест, который я провел, чтобы проверить, действительно ли сопоставления работают:

Код: Выделить всё

var mapper = _container.Resolve();
var p = new Patient();
p.Naam = "Test";
var vm = mapper.Map
(p);

vm.Naam.ShouldBeEquivalentTo("Test");
Этот тест проходит
Когда я вместо этого использую Map в Select(), он тоже работает, так что на самом деле это ProjectTo (), что не удается:

Код: Выделить всё

var results = await query.ToListAsync();
return new PagedResult
{
Results = results.Select(mapper.Map).ToList(),
Page = vm.Page,
PageSize = vm.PageSize,
Total = totalCount
};
Это работает, но требует, чтобы преобразователь был включен, а не внедрен, и он не использует ProjectTo, который имеет Automapper для доступа к базе данных...

Подробнее здесь: https://stackoverflow.com/questions/373 ... inding-map
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»