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...
}