Multiple AutoMapper.Configure () dans Global.asax
Je suis en utilisant AutoMapper à la carte entre DTO objets et de mon business objects. J'ai deux AutoMapperConfiguration.fichiers cs - dans ma couche de service et un autre dans mon api web de la couche.
Comme indiqué dans la réponse sur le lien suivant
Où placer AutoMapper.CreateMaps?
Je suis l'appel de la fonction Configure() de ces deux fichiers dans mon Global.asax classe
AutoMapperWebConfiguration.Configure();
AutoMapperServiceConfiguration.Configure();
mais il semble que mon Service Configurer l'appel (l'appel de la deuxième) est d'écraser les mappages de l'api web de la couche (le premier appel) et j'obtiens une exception en disant: la Cartographie est manquant.
Si j'inverse le Configurer des appels à ressembler à ce
AutoMapperServiceConfiguration.Configure();
AutoMapperWebConfiguration.Configure();
Je n'ai pas l'exception pour le web api de cartographie, mais j'obtiens le même mappage exception de la couche de Service.
Je fais quelque chose de mal parce que c'est clairement marqué comme réponse ci-dessus débordement de pile lien?
Voici mon 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>();
}
}
Pour contourner ce problème, je suis en ajoutant les profils de service dans le AutoMapperWebConfiguration classe et en n'appelant AutoMapperWebConfiguration.Configurer ().asax.
source d'informationauteur manu79
Vous devez vous connecter pour publier un commentaire.
Les appels à Mappeur.Initialiser réinitialiser le mappeur donc tout ce qui s'est passé avant est effacé.
Déplacer les appels à AddProfile dans un Mappeur.Initialiser appel et tout doit être bien:
@GruffBunny réponse est bonne, mais j'ai essayé de le rendre un peu plus lisible pour l'évolutivité (par exemple, si vous avez de nombreux, complexes
Mapper.Initialize()
méthodes, et peut ajouter plus à l'avenir).Je l'ai fait par la mise en œuvre de la structure suivante dans tous de mon
AutoMapperConfiguration.cs
fichiers:Extrait de la
Action<IConfiguration>
de votreMapper.Initialize()
méthode dans une propriété publiqueJe l'appelle
ConfigAction
dans chacun d'eux.Cela vous permet d'invoquer l'action de n'importe où vous avez besoin d'appeler
Mapper.Initialize
.Mapper.Initialize()
à l'intérieur deConfigure()
maintenant juste les références de cette propriétéVous pouvez ensuite appeler vos différentes
ConfigAction
s dans votre unique, centralisé appel àMapper.Initialize()
AutoMapperConfiguration.Configure()
dansApplication_Start()
devientCeci élimine le besoin de copier-coller le corps de la méthode de chaque
Mapper.Initialize()
appel dans votre central téléphonique. SEC et tout ça.De mettre à jour @theyetiman brillante réponse pour AutoMapper 5.2 & .NET de Base.
API web ou de démarrage.