Hi there,
Been having some real issues with automapper, i think i have found the solution but unsure of how to implement it..
basically i am using a custom mapping with ResolveUsing and ConstructedBy to pass in params to the constructor, i understand that most people set this up in the global.asax once and forget about it..
But the problem is that my method (on a wcf) passes in different params to the constructor of a resolveusing ......
Before i was using the Mapper.CreateMap and Mapper.Map which are static methods and it appears that when different petitions come into the wcf service via methods (multi -user) they are conflicting with each othere..
After reading something it appears i can use the instance version of CreateMap and Map so that each individual petition gets its own map and can pass in its own params..
But i can't seem to find how to do it.. can anyone explain please? I am really stuck...
Before now and again i would get duplicate key errors and also i put in a log trace on teh constructor and it appears that 1 petition is overwritting the other - hence the static versions of Mapper..
Well i hope i am correct but i can't find anything else...
I would really appreciated any help
EDITED - AN EXAMPLE OF WHAT I HAVE
Basically all mapping is working as it should as i am using MapFrom in most cases,
Then i create an instance of my Resolver which i pass in a URL, I have checked the url before i pass it in and its correct. But once it returns it returns the wrong URL.
The reason i need pass in the URL is that it has variables in there so i need to replaced the variables... Basically there are 2 urls depending on the office and i have logs everywhere and i can see what i am passing in but once i pass it in - it isn't the one i passed in if that makes sense, this is weird!!
Its a WCF service and a client has called the method twice passing in 2 different offices hence 2 different URLs .. but they always return the same URL its like one session is overwritting the other...
I hope this makes sense...
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))
;
FOUND OUT WHERE IS FAILING - BUT UNKNOWN WHY
See my comments inline with code. In the constructor the urlTemplate arrives, i save it in a private var.. ANd then in the overriden ResolveCore its something else :-)
I have placed some log4net logs on there so i can see whats happening..
[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
TEMPORARY SOLUTION
I have done a temporary solution but its really bad, i am sure automapper can do what i am trying but i am obvious not doing something right..
Basically I return via LINQ a collection of records (THIS IS MY SOURCE) so i entered a new field on every record that has the correct URL template on there.. And then instead of passing in (via constructor) the url template i have it available as a property on EVERY record on the collection (THE SOURCE) ... and it works perfect.
of course this really is patch and not ideal but it gets me running..
But i would really love to know where i am going wrong?