Я хочу использовать AutoMapper 9.0 в проекте WCF, содержащем несколько служб, которые будут размещены в IIS. Я нашел только еще один связанный с этим вопрос, но он касается 10-летней версии AutoMapper и не задает тот же вопрос. Его ответ похож на топ-хиты в Google, которые предлагают использовать ServiceBehavior
, но это неприменимо, когда я хочу, чтобы несколько служб использовали один и тот же маппер. Защита отдыхает.
В веб-проекте вы можете создать stati c MapperConfiguration
в Global.asax
при запуске приложения, но WCF не имеет Global.asax
. Похоже, есть несколько вариантов выполнения кода инициализации в WCF:
- Включить метод
AppInitialize()
в папку App_Code. Это будет динамически скомпилировано во время выполнения, и люди жаловались, что в IIS могут отсутствовать проблемы со ссылками, поэтому я не уверен AutoMapper
или его зависимости будут найдены после развертывания в IIS. - Создание пользовательского
ServiceHost
. Это выглядит так, как будто оно будет выполняться один раз при запуске приложения, но также выглядит так, как будто оно игнорирует конфигурацию web.config, которая мне не нужна. - Используйте метод
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?