Mehrere AutoMapper.Configure() in der Globalen.asax
Ich bin mit AutoMapper die Zuordnung zwischen DTO-Objekte und mein business objects. Ich habe zwei AutoMapperConfiguration.cs-Dateien - in meinem service-layer und einem anderen in meinem web-api-Schicht.
Wie in der Antwort unter dem folgenden link
Wo AutoMapper.CreateMaps?
Ich bin dem Aufruf der Configure() diese beiden Dateien in mein Global.asax-Klasse
AutoMapperWebConfiguration.Configure();
AutoMapperServiceConfiguration.Configure();
aber wie es scheint, die meinen Dienst Configure-Aufruf (der zweite Aufruf) überschreiben die Zuweisungen des web-api-Schicht (dem ersten Aufruf) und ich erhalte eine Ausnahme, nämlich die Zuordnung fehlt.
Wenn ich Umgekehrt die Konfiguration Aufrufe dann so Aussehen
AutoMapperServiceConfiguration.Configure();
AutoMapperWebConfiguration.Configure();
Habe ich nicht bekommen, die Ausnahme für die web-api-mapping, aber ich bekomme die gleiche Zuordnung Ausnahme für den Service layer.
Mache ich etwas falsch, denn dieser ist deutlich gekennzeichnet als eine Antwort in der obigen stack-overflow-link?
Hier ist mein code:
public static class AutoMapperServiceConfiguration
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.AddProfile<CmciFlowTestToGenericFlowTestSimpleMappingProfile>();
x.AddProfile<FsrsFlowTestToGenericFlowTestSimpleMappingProfile>();
});
}
}
public class FsrsFlowTestToGenericFlowTestSimpleMappingProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<FsrsFlowTest, GenericFlowTest>()
.ConvertUsing<FsrsFlowTestToGenericFlowTestSimpleConverter>();
}
}
public class FsrsFlowTestToGenericFlowTestSimpleConverter : TypeConverter<FsrsFlowTest, GenericFlowTest>
{
protected override GenericFlowTest ConvertCore(FsrsFlowTest source)
{
if (source == null)
{
return null;
}
return new GenericFlowTest
{
FlowTestDate = source.FlowTestDates,
StaticPsi = source.HydrantStaticPsi.ToString(),
ResidualPsi = source.HydrantResidualPsi.ToString(),
TotalFlow = source.NffGallonsPerMinute.ToString(),
FlowTestLocation = source.FsrsFlowTestLocations.Any()
? source.FsrsFlowTestLocations.First().LocationDescription
: null
};
}
public class CmciFlowTestToGenericFlowTestSimpleMappingProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<CmciFlowTest, GenericFlowTest>()
.ConvertUsing<CmciFlowTestToGenericFlowTestSimpleConverter>();
}
}
public class CmciFlowTestToGenericFlowTestSimpleConverter : TypeConverter<CmciFlowTest, GenericFlowTest>
{
protected override GenericFlowTest ConvertCore(CmciFlowTest source)
{
if (source == null)
{
return null;
}
return new GenericFlowTest
{
FlowTestDate = source.FlowTestDates,
StaticPsi = source.HydrantStaticPsi.ToString(),
ResidualPsi = source.HydrantResidualPsi.ToString(),
TotalFlow = source.CalculatedHydrantGallonsPerMinute.ToString(),
FlowTestLocation = source.StaticLocationHydrantFlowPSI
};
}
}
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.AddProfile<ServiceToWebApiMappingProfile>();
x.AddProfile<WebApiToServiceMappingProfile>();
});
}
}
public class ServiceToWebApiMappingProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<ServiceFlowTest, FlowTest>();
}
}
public class WebApiToServiceMappingProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<PropertyAddress, ServicePropertyAddress>();
}
}
Zu bekommen, um dieses Problem, ich bin das hinzufügen der service-profile in der AutoMapperWebConfiguration Klasse und nur aufrufen AutoMapperWebConfiguration.Configure() in der globalen.asax.
Sind Sie nur aufrufen
CreateMap
im Konfigurieren von Methoden?Sind Sie zufällig aufrufen
Mapper.Reset();
?Nein, ich fordere nicht-Mapper.Reset().
Ich bin mit Profile. Ich rufe CreateMap in meinem profile. In der Configure(), ich bin nur das hinzufügen von Profilen in Mapper.Initialize()
InformationsquelleAutor manu79 | 2013-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Aufrufe Mapper.Initialisieren zurücksetzen der mapper so alles, was gegangen ist, bevor Sie ausgelöscht wird.
Bewegen, die Anrufe zu AddProfile in einen Mapper.Aufruf von Initialize und alles ist gut:
InformationsquelleAutor Gruff Bunny
@GruffBunny s Antwort ist korrekt, aber ich habe versucht, um es ein bisschen übersichtlicher für die Skalierbarkeit (z.B. wenn Sie viele komplexe
Mapper.Initialize()
Methoden, und möglicherweise hinzufügen mehr in die Zukunft).Habe ich dies durch die Implementierung der folgenden Struktur alle meiner
AutoMapperConfiguration.cs
Dateien:Extrahieren Sie die
Action<IConfiguration>
aus Ihrer bestehendenMapper.Initialize()
Methode in einer öffentlichen EigenschaftIch nenne es
ConfigAction
.Dadurch können Sie die Aktion aufrufen von überall aufrufen zu müssen
Mapper.Initialize
.Mapper.Initialize()
innenConfigure()
jetzt nur Verweise diese EigenschaftKönnen Sie dann aufrufen, alle Ihre verschiedenen
ConfigAction
s in Ihrer einzigen, zentralen Aufruf anMapper.Initialize()
AutoMapperConfiguration.Configure()
imApplication_Start()
wirdDadurch entfällt die Notwendigkeit zum kopieren und einfügen die Methode Körper von jedem einzelnen
Mapper.Initialize()
rufen Sie in Ihrer zentrale anrufen. TROCKEN und all das.InformationsquelleAutor theyetiman
Aktualisieren @theyetiman geniale Antwort für AutoMapper 5.2 & .NET Core.
API-oder web-startup.
InformationsquelleAutor wonea