我想在 WCF 项目中使用 AutoMapper 9.0,该项目包含将在 IIS 中托管的多个服务。我只发现了另一个相关的 SO 问题,但它处理的是 10 年前的 AutoMapper 版本,并且没有问同样的问题。它的答案类似于建议使用 a 的 Google 上的热门歌曲,ServiceBehavior但当我希望多个服务使用同一个映射器时,这似乎不适用。防守休息。
在 Web 项目中,您可能会在应用程序启动时创建一个静态MapperConfiguration文件Global.asax,但 WCF 没有Global.asax. 看起来有几个选项可以在 WCF 中执行初始化代码:
AppInitialize()在 App_Code 文件夹中包含一个方法。这将在运行时动态编译,人们抱怨它在 IIS 中可能缺少引用问题,所以我不确定AutoMapper,否则一旦部署到 IIS 就会发现它的依赖关系。- 创建自定义
ServiceHost. 这似乎会在应用程序启动时执行一次,但看起来它忽略了我不想要的 web.config 配置。 - 使用每个服务的
Configure方法。这与 #2 具有相同的缺点,而且我开始关注线程安全(如ServiceBehavior方法中一样),因为两个服务可能会尝试MapperConfiguration一次初始化。
我考虑只创建一个具有静态属性的类,如果它尚未创建,它将创建一个静态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同时调用的地方。另一个缺点是对任何服务的第一个请求都必须等待映射编译,但我不确定我能摆脱这种情况。我绝对不希望它在每次调用时编译映射,甚至不希望每次服务都这样做。您能否就MapperConfigurationIIS 托管的 WCF 中的线程安全以及使用它的最佳方式提出建议?