Haben Sie einige echte Probleme mit AutoMapper. Ich denke, ich habe die Lösung gefunden, bin mir aber nicht sicher, wie ich sie umsetzen soll.Verwenden der Instanzversion von CreateMap und Map mit einem WCF-Dienst?
Im Grunde benutze ich eine benutzerdefinierte Zuordnung mit ResolveUsing und ConstructedBy, um Parameter an den Konstruktor zu übergeben, ich verstehe, dass die meisten Menschen dies in der global.asax einmal einrichten und vergessen.
Aber das Problem ist, dass meine Methode (auf einem WCF) verläuft in verschiedenen params an den Konstruktor eines ResolveUsing ......
Bevor ich die Mapper.CreateMap und Mapper.Map wurde mit, die statische Methoden und es scheint, dass, wenn verschiedene Petitionen über Methoden (Multiuser) in den WCF-Dienst kommen, sie miteinander in Konflikt stehen.
Nachdem ich etwas gelesen habe, kann ich die Instanz-Version von CreateMap und Map verwenden, so dass jede einzelne Petition ihre eigene Karte bekommt und ihre eigenen Params einreichen kann.
Aber ich kann nicht finden, wie es geht. Kann mir bitte jemand erklären? Ich bin wirklich fest ...
Bevor ich hin und wieder würde ich doppelte Schlüsselfehler bekommen und auch ich eine Protokoll-Trace auf dem Konstruktor und es scheint, dass 1 Petition die andere überschreibt - daher die statischen Versionen von Mapper.
Nun, ich hoffe, ich bin richtig, aber ich kann nichts anderes finden ...
EDITED - ein Beispiel dessen, was ich
Grundsätzlich sind alle Mapping, wie es sollte funktioniert, wie Ich verwende MapFrom in den meisten Fällen.
Dann erstelle ich eine Instanz meines Resolvers, die ich in einer URL übergeben. Ich habe die URL überprüft, bevor ich sie übergebe und sie korrekt ist. Sobald es zurückgegeben wird, wird jedoch die falsche URL zurückgegeben.
Der Grund, warum ich die URL übergeben muss, ist, dass es Variablen drin hat, also muss ich die Variablen ersetzen ... Grundsätzlich gibt es 2 URLs je nach Büro und ich habe Logs überall und ich kann sehen, was ich bin vorbeikommen, aber sobald ich es übergebe - es ist nicht derjenige, an dem ich vorbeikam, wenn das Sinn macht, ist das komisch !!
Es ist ein WCF-Dienst und ein Client hat die Methode zweimal in zwei verschiedenen Büros und damit zwei verschiedenen URLs aufgerufen. Sie geben jedoch immer dieselbe URL zurück. Es ist wie eine Sitzung überschreibt die andere ...
Ich hoffe, das macht Sinn.
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))
;
herausgefunden, wo FAILING - aber nicht bekannt, warum
inline meine Kommentare anzeigen mit Code. Im Konstruktor kommt das urlTemplate an, ich speichere es in einer privaten var und dann im überschriebenen ResolveCore, es ist etwas anderes :-)
Ich habe ein paar log4net-Logs dort hingelegt, damit ich sehen kann, was passiert.
[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
Notlösung
Ich habe eine vorübergehende Lösung getan, aber es ist wirklich schlecht. Ich bin mir sicher, dass Autofahrer das tun können, was ich versuche, aber ich mache offensichtlich etwas falsch.
Grundsätzlich gebe ich über LINQ eine Sammlung von Datensätzen zurück (DAS IST MEINE QUELLE), also habe ich ein neues Feld in jeden Datensatz eingegeben, der die korrekte URL-Vorlage enthält. Und dann, anstatt (über Konstruktor) die URL-Vorlage einzutragen, habe ich sie als Eigenschaft auf JEDEM Datensatz in der Sammlung verfügbar (THE SOURCE) ... und sie funktioniert perfekt.
Natürlich ist das wirklich Patch und nicht ideal, aber es bringt mich zum Laufen.
Wohin gehe ich falsch?
In Ihrem Beispiel ist es, dass Sie nicht wissen, die Quelle bis zur Laufzeit Aber wissen Sie, zu welchem Ziel Sie bei der Kompilierung zugeordnet sind? –
Nein, ich kenne die Quelle ... aber ich übergebe Variablen in ResolveUsing mit Konstruktor daher muss die Karte immer erstellt werden und muss nicht von anderen Sitzungen usw. geteilt werden. –
Wenn dies ein WCF-Dienst ist, wird es in ausgeführt eigene App-Domain, so dass die Karten nicht mit anderen Prozessen geteilt werden. Es klingt wie die Argumente zu ResolveUsing variieren, aber ResolveUsing verwendet den Quellentyp in der Regel. Was ist der Grund dafür, dass Sie Argumente in den Konstruktor Ihres benutzerdefinierten Werte-Resolvers eingeben, die sich außerhalb Ihres Quelltyps befinden? –