standard net imapper example ejemplo .net asp.net-mvc automapper

.net - net - automapper nuget



¿Es Mapper.Map en AutoMapper seguro para subprocesos? (2)

El tema vinculado más o menos responde a tus preguntas:

Mapper.CreateMap no es seguro para subprocesos, ni lo será nunca. Sin embargo, Mapper.Map es seguro para subprocesos. La clase estática Mapper es solo una envoltura delgada sobre los objetos MappingEngine y Configuration.

Solo use Mapper.CreateMap si realiza la configuración en un lugar central de una manera segura para subprocesos.

Tu comentario fue:

Lo pregunto porque me gustaría configurar el autómata en el lugar, es decir, justo antes del uso. Planeé configurarlo en un contexto no concurrente, es decir, ~ lock (mapperConfigLock) {Mapper.CreateMap () ....; }, y me temo que esto no es suficiente ahora.

Si está realizando una configuración in situ, simplemente no use la clase Mapper estática. Como el comentario sobre el problema de github sugiere usar el motor de mapeo directamente:

var config = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); config.CreateMap<Source, Destination>(); var engine = new MappingEngine(config); var source = new Source(); var dest = engine.Map(source);

Es un poco más de código, pero puedes crear tus propios ayudantes a su alrededor. Pero todo es local en un método dado, por lo que no hay estado compartido, no hay que preocuparse por la seguridad de los hilos.

Estoy buscando el código AutoMapper ahora (evaluándolo para uno de los proyectos en los que estoy trabajando) y, francamente, estoy bastante sorprendido:

  • La API de la biblioteca se basa en un único punto de acceso estático (tipo Mapper ), por lo que generalmente cualquiera de sus métodos debe ser seguro para subprocesos
  • Pero no encontré ninguna evidencia de esto en el código.

Todo lo que pude encontrar es este problema , pero incluso la declaración hecha allí parece incorrecta: si Map no usa internamente estructuras de datos seguras para subprocesos, tampoco puede considerarse como seguro para subprocesos, si voy para llamar a CreateMap en un contexto no concurrente, pero al mismo tiempo con Map .

Es decir, el único patrón de uso posible de AutoMapper en, por ejemplo, la aplicación MVC de ASP.NET es:

lock (mapperLock) { ... Mapper.AnyMethod(...) ... }

Obviamente, si estoy en lo cierto, es una falta enorme.

Así que tengo dos preguntas:

  • ¿Estoy en lo correcto?
  • Si es así, ¿cuál es la mejor alternativa para AutoMapper que no tiene este problema?

Estas preguntas pueden estar un poco desactualizadas, solo quiero registrar algunos de mis hallazgos después de un poco de investigación.

Mapper es una clase de envoltorio para envolver para crear una nueva configuración, y una nueva instancia de mapeador dentro de la memoria estática, por lo que, estrictamente, no es seguro para subprocesos, pero puede usarlo con seguridad siempre y cuando solo inicialice la configuración una vez.

MapperConfiguration crea una nueva instancia del asignador y registra la configuración dentro de su propio espacio de memoria de instancia.

TLDR;

Si necesita iniciar la configuración solo UNA VEZ, elija la API estática

Si necesita iniciar la configuración muchas veces, y preocuparse por la seguridad del subproceso, elija la API de instancia