Где я могу настроить этот AutoMapper в ASP.NET - PullRequest
1 голос
/ 22 сентября 2019

Я использую обычный 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);         
}

1 Ответ

0 голосов
/ 22 сентября 2019

После дальнейших исследований я пришел к этому подходу, который похож на тот, что я делал ранее, но он более доступен для любого:

AutomapperConfig.cs:

public class ClientMappingProfile : Profile
    {
        public ClientMappingProfile()
        {
            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 class AutoMapperConfig
    {
        public MapperConfiguration Configure()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile<ClientMappingProfile>();
            });
            return config;
        }
    }

XXXController.cs:

public class ActivitiesController : ApiController
    {
        private ApplicationDbContext db = new ApplicationDbContext();

        ....

[HttpGet]
        [Route("api/v1/Activities/{sortfields=Id}/{pagenumber=1}/{pagesize=10}", Name="GetActivities")]
        [CacheOutput(ClientTimeSpan = 60, ServerTimeSpan = 60)]
        public async Task<IHttpActionResult> GetActivities(string sortfields, int pageNumber, int pageSize)
        {
            var config = new AutoMapperConfig().Configure();

            ...

            var activitiesDTO = await (db.Activities
                                        .Include(b => b.User)
                                        .Include(c => c.Category)
                                        .Where(q => q.UserId == userId)
                                        .ProjectTo< ActivityDTO>(config)
                                        .AsQueryable()
                                        .ApplySort(sortfields)
                                        .Skip((pageNumber - 1) * pageSize).Take(pageSize)).ToListAsync();   

 ....

return Ok(Data)

}

}

Я мог бы потенциально переместить var config = new AutoMapperConfig().Configure(); в приватные свойства, доступные любым методам.

Кто-нибудь использует этот подход?Я видел, как некоторые люди настраивали через Global.asax такие вещи, как неудачная попытка (оригинальный вопрос).Опять же не уверен, является ли этот подход старым решением.

Ваша мысль?

...