Как использовать AutoMapper 9.0.0 в Asp.Net Web Api 2 без внедрения зависимостей? - PullRequest
0 голосов
/ 01 октября 2019

Я не смог найти никакой информации, где разместить этот код в моем проекте. Прямо сейчас я использую это в каждом действии, мне нужен картограф. Есть ли лучший способ сделать это без внедрения зависимостей?

var config = new MapperConfiguration(cfg => {
                cfg.CreateMap<Source, Dest>();
            });
            IMapper iMapper = config.CreateMapper();


            var destList= iMapper.Map<Dest[]>(sourceList);

1 Ответ

2 голосов
/ 02 октября 2019

Внедрение зависимостей добавило целый уровень сложности моему устаревшему проекту, с которым я просто не хотел иметь дело. 9.0 удалил API для его статического вызова.

Так что я просто пересмотрел то, что он делал в 8.0, и написал оболочку для него.

public static class MapperWrapper 
{
    private const string InvalidOperationMessage = "Mapper not initialized. Call Initialize with appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.";
    private const string AlreadyInitialized = "Mapper already initialized. You must call Initialize once per application domain/process.";

    private static IConfigurationProvider _configuration;
    private static IMapper _instance;

    private static IConfigurationProvider Configuration
    {
        get => _configuration ?? throw new InvalidOperationException(InvalidOperationMessage);
        set => _configuration = (_configuration == null) ? value : throw new InvalidOperationException(AlreadyInitialized);
    }

    public static IMapper Mapper
    {
        get => _instance ?? throw new InvalidOperationException(InvalidOperationMessage);
        private set => _instance = value;
    }

    public static void Initialize(Action<IMapperConfigurationExpression> config)
    {
        Initialize(new MapperConfiguration(config));
    }

    public static void Initialize(MapperConfiguration config)
    {
        Configuration = config;
        Mapper = Configuration.CreateMapper();
    }

    public static void AssertConfigurationIsValid() => Configuration.AssertConfigurationIsValid();
}

Для его инициализации есть метод configure

public static class AutoMapperConfig
{
    public static void Configure()
    {
        MapperWrapper.Initialize(cfg =>
        {
            cfg.CreateMap<Foo1, Foo2>();              
        });

        MapperWrapper.AssertConfigurationIsValid();
    }
}

И просто вызовите его при запуске

AutoMapperConfig.Configure();

Чтобы использовать его, просто добавьте MapperWrapper перед вызовом Mapper. Можно звонить куда угодно.

 MapperWrapper.Mapper.Map<Foo2>(Foo1);
...