Я использую обычный ASP.NET, а не .NET Core.
В данный момент отображение работает хорошо, НО я помещаю следующий код инициализации в контроллер ивызывается из контроллера, который после исследования, вероятно, не очень хорошая идея.
Поэтому попытался создать его для инициализации нового класса, а затем вызвал его из Global.asax.Но у меня возникла проблема - «Mapper» не содержит определения «Initialize» .Похоже, я использую старую версию AutoMapper или что-то.Я прочитал это в документации: настройка должна происходить только один раз для каждого домена приложений.Это означает, что лучшее место для размещения кода конфигурации - это запуск приложения, например, файл Global.asax для приложений ASP.NET.Как правило, класс начальной загрузки конфигурации находится в своем собственном классе, и этот класс начальной загрузки вызывается из метода запуска.Класс bootstrapper должен создать объект MapperConfiguration для настройки карт типов.
Итак, как это вписывается в мои текущие попытки?
Мой следующий вопрос, после правильной настройки, как мне вызвать это в контроллере?
IЯ ценю ваши отзывы / комментарии.
Спасибо
Текущая конфигурация в контроллере (вероятно, не очень хорошая идея - НО работает):
private MapperConfiguration configuration = new MapperConfiguration(cfg => {
cfg.CreateMap<Activity, ActivityDTO>()
.ForMember(dst => dst.OwnerId, src => src.MapFrom(ol => ol.User.Id))
.ForMember(dst => dst.OwnerName, src => src.MapFrom(ol => ol.User.FirstName + " " + ol.User.LastName))
.ForMember(dst => dst.CategoryName, src => src.MapFrom(ol => ol.Category.Name));
cfg.CreateMap<ActivityDTO, Activity>()
.ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()));
});
Текущий метод, вызывающий указанную выше конфигурацию:
var activitiesDTO = await (db.Activities
.Include(b => b.User)
.Include(c => c.Category)
.Where(q => q.UserId == userId)
.ProjectTo< ActivityDTO>(configuration)
.AsQueryable()
.ApplySort(sortfields)
.Skip((pageNumber - 1) * pageSize).Take(pageSize)).ToListAsync();
Попытка - ошибка:
AutomapperWebProfile.cs:
public class AutomapperWebProfile : AutoMapper.Profile
{
public AutomapperWebProfile()
{
CreateMap<Activity, ActivityDTO>()
.ForMember(dst => dst.OwnerId, src => src.MapFrom(ol => ol.User.Id))
.ForMember(dst => dst.OwnerName, src => src.MapFrom(ol => ol.User.FirstName + " " + ol.User.LastName))
.ForMember(dst => dst.CategoryName, src => src.MapFrom(ol => ol.Category.Name));
CreateMap<ActivityDTO, Activity>()
.ForMember(dst => dst.UserId, opt => opt.MapFrom(src => HttpContext.Current.User.Identity.GetUserId()));
}
public static void Run()
{
AutoMapper.Mapper.Initialize(a =>
{
a.AddProfile<AutomapperWebProfile>();
});
}
}
Global.asax:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutomapperWebProfile.Run();
GlobalConfiguration.Configuration.Formatters
.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters
.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
}