首页 > 解决方案 > 如何在 IIS 托管的 WCF 应用程序中配置 AutoMapper 9.0

问题描述

我想在 WCF 项目中使用 AutoMapper 9.0,该项目包含将在 IIS 中托管的多个服务。我只发现了另一个相关的 SO 问题,但它处理的是 10 年前的 AutoMapper 版本,并且没有问同样的问题。它的答案类似于建议使用 a 的 Google 上的热门歌曲,ServiceBehavior但当我希望多个服务使用同一个映射器时,这似乎不适用。防守休息。

在 Web 项目中,您可能会在应用程序启动时创建一个静态MapperConfiguration文件Global.asax,但 WCF 没有Global.asax. 看起来有几个选项可以在 WCF 中执行初始化代码:

  1. AppInitialize()在 App_Code 文件夹中包含一个方法。这将在运行时动态编译,人们抱怨它在 IIS 中可能缺少引用问题,所以我不确定AutoMapper,否则一旦部署到 IIS 就会发现它的依赖关系。
  2. 创建自定义ServiceHost. 这似乎会在应用程序启动时执行一次,但看起来它忽略了我不想要的 web.config 配置。
  3. 使用每个服务的Configure方法。这与 #2 具有相同的缺点,而且我开始关注线程安全(如ServiceBehavior方法中一样),因为两个服务可能会尝试MapperConfiguration一次初始化。

我考虑只创建一个具有静态属性的类,如果它尚未创建,它将创建一个静态MapperConfigurationIMapper实例,但与 #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同时调用的地方。另一个缺点是对任何服务的第一个请求都必须等待映射编译,但我不确定我能摆脱这种情况。我绝对不希望它在每次调用时编译映射,甚至不希望每次服务都这样做。您能否就MapperConfigurationIIS 托管的 WCF 中的线程安全以及使用它的最佳方式提出建议?

标签: wcfthread-safetyautomapper.net-4.7.2automapper-9

解决方案


推荐阅读