Имеет некоторые реальные проблемы с automapper. Я думаю, что нашел решение, но не знаю, как его реализовать.Использование версии экземпляра CreateMap и Map с помощью службы WCF?
В основном я использую настраиваемое сопоставление с ResolveUsing и ConstructedBy для передачи в params конструктору, я понимаю, что большинство людей задают это в global.asax один раз и забывают об этом.
Но проблема в том, что мой метод (на ФОС) проходит в разных Params к конструктору ResolveUsing ......
Прежде чем я использовал Mapper.CreateMap и Mapper.Map, которые являются статические методы, и кажется, что, когда различные запросы поступают в службу wcf с помощью методов (multi -user), они конфликтуют друг с другом.
После прочтения чего-то я могу использовать экземплярную версию CreateMap и Map, чтобы каждое отдельное ходатайство получало свою собственную карту и могло передавать свои собственные параметры.
Но я не могу найти, как это сделать. Может ли кто-нибудь объяснить, пожалуйста? Я действительно застрял ...
Раньше я получал повторяющиеся ключевые ошибки, а также добавлял трассировку журнала в конструктор, и оказалось, что 1 петиция переписывает другую - следовательно, статические версии Mapper.
Ну, я надеюсь, что я правильно, но я не могу найти что-нибудь еще ...
EDITED - пример того, что я
В основном все отображения работает, как должно, так как В большинстве случаев я использую MapFrom.
Затем я создаю экземпляр моего резольвера, который я передаю по 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))
;
разузнала, где не удается - НО ПОЧЕМУ UNKNOWN
Смотрите мои комментарии рядный с кодом. В конструкторе появляется 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, я имею его как свойство в КАЖДОЙ записи в коллекции (ИСТОЧНИК) ... и он отлично работает.
Конечно, это действительно патч и не идеальный, но он заставляет меня бежать.
Куда я иду не так?
В вашем примере это, что вы не знаете источника до выполнения но вы знаете, какую цель вы планируете во время компиляции? –
Нет, я знаю источник ... но я передаю переменные в ResolveUsing с использованием конструктора, следовательно, карта должна создаваться каждый раз и не должна использоваться другим сеансом и т. Д. –
Если это служба WCF, она работает в ее собственный домен приложения, поэтому карты не будут использоваться ни с каким другим процессом. Похоже, что аргументы ResolveUsing различаются, но ResolveUsing обычно использует тип источника. Какова аргументация для того, чтобы вы передавали аргументы в конструктор вашего настраиваемого Value Resolver, который находится вне вашего типа источника? –