net injection imapper dependency asp c# moq automapper

c# - injection - Simulador de AutoMapper Mapper.Map llamada usando Moq



automapper dependency injection (3)

¿Cuál es la mejor manera de configurar una exposición simulada para la función Mapa en AutoMapper?

Extraigo la interfaz de IMapper para poder configurar las expectativas de esa interfaz. Mi asignador tiene dependencias, por lo que tengo que pasarlas al asignador.

¿Qué sucede cuando creo 2 instancias de mi clase de asignador, con 2 implementaciones de dependencia diferentes? Asumo que ambos mapeadores usarán la misma instancia de dependencia, ya que el mapa AutoMapper es estático. O AutoMapper podría incluso lanzar una excepción porque intento configurar 2 mapas diferentes con los mismos objetos.

¿Cuál es la mejor manera de resolver esto?

public interface IMapper { TTarget Map<TSource, TTarget>(TSource source); void ValidateMappingConfiguration(); } public class MyMapper : IMapper { private readonly IMyService service; public MyMapper(IMyService service) { this.service = service Mapper.CreateMap<MyModelClass, MyDTO>() .ForMember(d => d.RelatedData, o => o.MapFrom(s => service.getData(s.id).RelatedData)) } public void ValidateMappingConfiguration() { Mapper.AssertConfigurationIsValid(); } public TTarget Map<TSource, TTarget>(TSource source) { return Mapper.Map<TSource, TTarget>(source); } }


¿Cuál es la mejor manera de configurar una exposición simulada para la función Mapa en AutoMapper [?]

Aquí hay una forma:

var mapperMock = new Mock<IMapper>(); mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());


Lo que debe hacer es configurar AutoMapper de esta manera (StructureMap es IoC). Entonces puedes hacer que tus servicios dependan de IMappingEngine. A partir de ahí la burla debería ser muy fácil.

public class AutoMapperConfigurationRegistry : Registry { public AutoMapperConfigurationRegistry() { ForRequestedType<Configuration>() .CacheBy(InstanceScope.Singleton) .TheDefault.Is.OfConcreteType<Configuration>() .CtorDependency<IEnumerable<IObjectMapper>>().Is(expr => expr.ConstructedBy(MapperRegistry.AllMappers)); ForRequestedType<ITypeMapFactory>().TheDefaultIsConcreteType<TypeMapFactory>(); ForRequestedType<IConfigurationProvider>() .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>()); ForRequestedType<IConfiguration>() .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>()); } }