Ответ 1
Каков наилучший способ настройки макета для функции Map в AutoMapper [?]
Здесь один из способов:
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
Каков наилучший способ настройки макета для функции Map в AutoMapper.
Я извлекаю интерфейс IMapper, поэтому я могу настроить для этого интерфейса. У моего картографа есть зависимости, поэтому я должен передать их в обработчик.
Что происходит, когда я создаю 2 экземпляра моего класса mapper с двумя различными реализациями зависимостей? Я предполагаю, что оба mappers будут использовать один и тот же экземпляр зависимостей, поскольку карта AutoMapper является статической. Или AutoMapper может даже вызвать исключение, потому что я пытаюсь настроить 2 разных карты с теми же объектами.?
Каков наилучший способ решить эту проблему?
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);
}
}
Каков наилучший способ настройки макета для функции Map в AutoMapper [?]
Здесь один из способов:
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<Foo, Bar>(It.IsAny<Foo>())).Returns(new Bar());
http://richarddingwall.name/2009/05/07/mocking-out-automapper-with-dependency-injection/
Указывает на другой способ обработки зависимостей с AutoMapper, который в основном заменит мою попытку извлечь мой собственный интерфейс IMapper. Вместо этого я попытаюсь использовать существующий IMappingEngine как зависимость для моих классов, чтобы увидеть, работает ли это.
Что вам нужно сделать, так это настроить AutoMapper (StructureMap - IoC). Затем вы можете сделать ваши услуги зависимыми от IMappingEngine. Оттуда это должно быть очень легко.
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>());
}
}