Имеют некоторые реальные проблемы с automapper. Я думаю, что нашел решение, но не знаю, как его реализовать.
В основном я использую настраиваемое сопоставление с ResolveUsing и ConstructedBy для передачи в params конструктору, я понимаю, что большинство людей задают это в global.asax один раз и забывают об этом.
Но проблема в том, что мой метод (на wcf) проходит в разных параметрах к конструктору ResolveUsing......
До того, как я использовал Mapper.CreateMap и Mapper.Map, которые являются статическими методами, и кажется, что когда различные запросы поступают в службу wcf с помощью методов (multi -user), они конфликтуют друг с другом.
После прочтения чего-то я могу использовать экземплярную версию CreateMap и Map, чтобы каждое отдельное ходатайство получало свою собственную карту и могло передавать свои собственные параметры.
Но я не могу найти, как это сделать. Может ли кто-нибудь объяснить, пожалуйста? Я действительно застрял...
Раньше я получал повторяющиеся ключевые ошибки, а также добавлял трассировку журнала в конструктор, и оказалось, что 1 петиция перезаписывает другую - следовательно, статические версии Mapper.
Надеюсь, я прав, но больше ничего не могу найти...
EDITED - пример того, что у меня есть
В основном все сопоставление работает так, как должно, поскольку я использую MapFrom в большинстве случаев.
Затем я создаю экземпляр моего Resolver, который я передаю в URL. Я проверил URL-адрес, прежде чем передать его и правильно. Но как только он вернется, он вернет неправильный URL.
Причина, по которой мне нужно пройти по URL-адресу, заключается в том, что в нем есть переменные, поэтому мне нужно заменить переменные... В основном есть два URL-адреса в зависимости от офиса, и у меня есть журналы везде, и я вижу, что я прохожу но, как только я передаю его, это не тот, который я прошел, если это имеет смысл, это странно!
Его служба WCF и клиент вызвали метод, дважды проходящий в 2 разных офисах, следовательно, два разных URL-адреса. Но они всегда возвращают один и тот же URL. Он как один сеанс перезаписывает другой...
Надеюсь, это имеет смысл.
SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode);
Mapper.CreateMap<Models.Custom.House, DTO.House>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TaxIncluded,
opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxIncluded))
.ForMember(dest => dest.TaxPercentage,
opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxPercentage))
.ForMember(dest => dest.SalesPoints,
opt =>
opt.ResolveUsing(newSalesPointResolver))
;
НАЙДЕН ГДЕ ЕСТЬ НЕИСПРАВНОСТЬ - НО НЕИЗВЕСТНО ПОЧЕМУ
См. мои комментарии в строке с кодом. В конструкторе появляется urlTemplate, я сохраняю его в приватном var, а затем в переопределенном ResolveCore это что-то еще: -)
Я разместил там журналы log4net, поэтому я вижу, что происходит.
[Log]
public class SalesPointResolver : ValueResolver<Models.Custom.House, IList<DTO.SalesPoint>>
{
private readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private string urlTemplate;
public SalesPointResolver (bool returnReservationUrl, string urlTemplate, DateTime startDate, DateTime endDate, string officeCode)
{
this.urlTemplate = urlTemplate;
log.Error("passed in " + urlTemplate); // THIS IS PERFECT
log.Error("I am now " + this.urlTemplate); // THIS IS PERFECT
}
protected override IList<DTO.SalesPoint> ResolveCore(House source)
{
this.house = source;
log.Error("in resolveCore :" + this.urlTemplate); // THIS IS RETURNING THE WRONG VALUE
ВРЕМЕННОЕ РЕШЕНИЕ
Я сделал временное решение, но это действительно плохо. Я уверен, что automapper может делать то, что я пытаюсь, но я, очевидно, что-то не так.
В принципе, я возвращаю через LINQ коллекцию записей (ЭТО МОЙ ИСТОЧНИК), поэтому я ввел новое поле в каждую запись, в которой есть правильный шаблон URL. И затем вместо того, чтобы передавать (через конструктор) шаблон url, я имею его как свойство в КАЖДОЙ записи в коллекции (ИСТОЧНИК)... и он отлично работает.
Конечно, это действительно патч, а не идеальный, но он запускает меня.
Где я иду не так?