net mvc example custom collection automapper

mvc - Aplique globalmente la resolución de valores con AutoMapper



automapper nuget (1)

Sí, pero con un ligero cambio en el ordenamiento del MapperRegistry. Primero, crea un convertidor de tipos de DateTime a DateTime:

Mapper.CreateMap<DateTime, DateTime>().ConvertUsing<CompanyTimeConverter>();

El código de su CompanyTimeConverter se parece mucho a la resolución de valores que tenía, excepto que se hereda de TypeConverter.

A continuación, tiene que cambiar el orden de MapperRegistry (voy a cambiar esto en el futuro, tiene más sentido):

MapperRegistry.AllMappers = () => new IObjectMapper[] { new DataReaderMapper(), new TypeMapMapper(TypeMapObjectMapperRegistry.AllMappers()), new StringMapper(), new FlagsEnumMapper(), new EnumMapper(), new ArrayMapper(), new EnumerableToDictionaryMapper(), new DictionaryMapper(), new ListSourceMapper(), new CollectionMapper(), new EnumerableMapper(), new TypeConverterMapper(), new AssignableMapper(), new NullableMapper() };

Originalmente, el asignador "Asignable" venía antes que el asignador "TypeConverter", por lo que si dos tipos se asignaban entre sí, solo haría eso.

Estoy tratando de que AutoMapper se encargue de localizar todas las propiedades de DateTime en nuestros modelos de vista para nosotros. Usamos UTC en cualquier parte de nuestro sistema y almacenamos todo en UTC en la base de datos, pero nos gustaría convertirlo automáticamente a la zona horaria del usuario para su visualización.

Después de ver todas las opciones, decidí usar un ValueResolver. Aquí está la esencia del resolutor:

public class LocalizedDateTimeFormatter : ValueResolver<DateTime, DateTime> { protected override DateTime ResolveCore(DateTime source) { // get company return company.TimeZone.ConvertFromUtc(source); } }

Estoy configurando el mapeo así:

Mapper.CreateMap<Entity, Model>() .ForMember(dest => dest.Foo, opt => opt.ResolveUsing<LocalizedDateTimeFormatter>() .FromMember(src => src.Foo));

Todo esto funciona bien, y estoy feliz con ello. Sin embargo, lo ideal es que nos gustaría una convención de todas las propiedades de DateTime en un modelo de vista para usar esta resolución de forma predeterminada. Comencé por el camino de reflexionar sobre las propiedades del modelo de vista, seleccionando DateTime y usando las sobrecargas de ForMember y FromMember que toman nombres de cadenas de propiedades, pero eso parecía ... feo. Además, duplicar la lógica de creación de nombres de propiedades anidadas de AutoMapper se descompondría bastante rápido.

Pregunta: ¿Hay alguna manera fácil de decirle a AutoMapper que use globalmente un ValueResolver como este? ¿Para decir "cada vez que asigne una propiedad DateTime en un origen a una propiedad DateTime en un destino, use esta resolución"?

Revisé las pruebas de AutoMapper y no vi nada que funcionara.

¡Gracias!