Я пробовал много тестов, но кажется, что карта невозможно найти только при использовании ProjectTo(). Использование Mapper.Map() в разных местах с одной и той же моделью и моделью представления прекрасно работает.
Я думаю, что-то не так с тем, как AutoMapper работает с моим DI (Autofac), но я не могу понять что.
Startup.Cs
Код: Выделить всё
public IServiceProvider ConfigureServices(IServiceCollection services)
{
(...)
// Autofac DI
AutofacContainer = AutofacLoader.Configure(services).Build();
return AutofacContainer.Resolve();
}
Код: Выделить всё
public static ContainerBuilder Configure(IServiceCollection services)
{
var builder = new ContainerBuilder();
(...)
// AutoMapper
builder.RegisterModule();
if (services != null)
{
builder.Populate(services);
}
return builder;
}
Код: Выделить всё
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();
}
}
'.
Код: Выделить всё
[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);
}
Код: Выделить всё
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;
}
Код: Выделить всё
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
};
Подробнее здесь: https://stackoverflow.com/questions/373 ... inding-map