AutoMapper автоматически создает createMap
У меня есть службы, которые вызывают другие службы. Обе службы используют "те же классы". Классы называются одинаковыми и имеют одинаковые свойства, но имеют другое пространство имен, поэтому мне нужно использовать AutoMapper для сопоставления с одним из типов на другой.
Нет, это довольно просто, поскольку все, что мне нужно сделать, это CreateMap<>
, но проблема в том, что у нас есть сотни классов, которые мне нужно вручную написать CreateMap<>
, и он работает со мной. Нет ли функции Auto CreateMap
. Поэтому, если я говорю CreateMap(), то AutoMapper работает через организацию и находит все классы и автоматически выполняет CreateMap
для этих классов, а подклассы и т.д. И т.д....
Надеюсь на простое решение, или я думаю, что некоторое отражение может исправить его...
Ответы
Ответ 1
Просто установите для параметра CreateMissingTypeMaps
значение true в параметрах:
var dto = Mapper.Map<FooDTO>
(foo, opts => opts.CreateMissingTypeMaps = true);
Если вам нужно часто его использовать, сохраните лямбда в поле делегата:
static readonly Action<IMappingOperationOptions> _mapperOptions =
opts => opts.CreateMissingTypeMaps = true;
...
var dto = Mapper.Map<FooDTO>(foo, _mapperOptions);
UPDATE:
Описанный выше подход больше не работает в последних версиях AutoMapper.
Вместо этого вы должны создать конфигурацию сопоставления с CreateMissingTypeMaps
, установленным в true, и создать экземпляр сопоставления из этой конфигурации:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMissingTypeMaps = true;
// other configurations
});
var mapper = config.CreateMapper();
Если вы хотите использовать старый статический API (больше не рекомендуется), вы также можете сделать это:
Mapper.Initialize(cfg =>
{
cfg.CreateMissingTypeMaps = true;
// other configurations
});
Ответ 2
В AutoMapper есть метод DynamicMap, который вы можете использовать: здесь пример unit test, иллюстрирующий его.
[TestClass]
public class AutoMapper_Example
{
[TestMethod]
public void AutoMapper_DynamicMap()
{
Source source = new Source {Id = 1, Name = "Mr FooBar"};
Target target = Mapper.DynamicMap<Target>(source);
Assert.AreEqual(1, target.Id);
Assert.AreEqual("Mr FooBar", target.Name);
}
private class Target
{
public int Id { get; set; }
public string Name { get; set; }
}
private class Source
{
public int Id { get; set; }
public string Name { get; set; }
}
}
Ответ 3
CreateMissingTypeMaps можно установить в вашем профиле. Тем не менее, рекомендуется явно использовать CreateMap для каждого сопоставления и вызывать AssertConfigurationIsValid в ваших модульных тестах для каждого профиля, чтобы предотвратить бесшумные ошибки.
public class MyProfile : Profile {
CreateMissingTypeMaps = true;
// Mappings...
}