Как настроить AutoMapper 9.0 в приложении WCF, размещенном на IIS - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу использовать AutoMapper 9.0 в проекте WCF, содержащем несколько служб, которые будут размещены в IIS. Я нашел только еще один связанный с этим вопрос, но он касается 10-летней версии AutoMapper и не задает тот же вопрос. Его ответ похож на топ-хиты в Google, которые предлагают использовать ServiceBehavior, но это неприменимо, когда я хочу, чтобы несколько служб использовали один и тот же маппер. Защита отдыхает.

В веб-проекте вы можете создать stati c MapperConfiguration в Global.asax при запуске приложения, но WCF не имеет Global.asax. Похоже, есть несколько вариантов выполнения кода инициализации в WCF:

  1. Включить метод AppInitialize() в папку App_Code. Это будет динамически скомпилировано во время выполнения, и люди жаловались, что в IIS могут отсутствовать проблемы со ссылками, поэтому я не уверен AutoMapper или его зависимости будут найдены после развертывания в IIS.
  2. Создание пользовательского ServiceHost. Это выглядит так, как будто оно будет выполняться один раз при запуске приложения, но также выглядит так, как будто оно игнорирует конфигурацию web.config, которая мне не нужна.
  3. Используйте метод Configure per служба. Это имеет тот же недостаток, что и # 2, и я также обеспокоен безопасностью потоков (как в подходе ServiceBehavior), поскольку две службы могут попытаться инициализировать MapperConfiguration сразу.

, который я рассмотрел просто создайте класс со свойством stati c, которое создаст экземпляр stati c MapperConfiguration или IMapper, если он еще не был создан, но, как и в # 3, я боюсь, что это не может быть потокобезопасным , Может быть, если бы я сделал что-то подобное?

public static class MapperConfig
{
    private static IMapper _modelMapper;
    private static readonly object _mapperLocker = new object();

    public static IMapper ModelMapper
    {
        get
        {
            lock(_mapperLocker)
            {
                if (_modelMapper == null)
                {
                    var config = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile1()));
                    _modelMapper = config.CreateMapper();
                }
            }

            return _modelMapper;
        }
    }
}

Где две службы могут одновременно вызывать ModelMapper. Другим недостатком этого является то, что первый запрос к любому сервису должен будет ждать компиляции сопоставления, но я не уверен, что смогу избежать этого. Я определенно не хочу, чтобы он компилировал сопоставления для вызова, и предпочел бы даже не делать это для каждой службы. Можете ли вы посоветовать безопасность потока MapperConfiguration и лучший способ его использования в WCF, размещенном на IIS?

...