【发布时间】:2018-11-26 10:27:21
【问题描述】:
我刚刚将我的 WCF 服务项目中的 Automapper 升级到最新版本 8.0.0。通过 WCF 测试客户端调用服务时出现以下错误:
System.InvalidOperationException: '映射器已经初始化。您必须为每个应用程序域/进程调用一次 Initialize。'
使用旧的 Automapper 版本 6.0.2,它可以正常工作并且不会引发异常。我用一个单独的服务行为类初始化了 Mapper。
服务类EdiPartners.cs:
[AutomapServiceBehavior]
[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode =
InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class EdiPartners : IPartners
{
[FaultContract(typeof(ExceptionObject))]
public Supplier GetPartnerData(string SupplierNumber)
{
// Code
}
}
服务行为类AutomapServiceBehavior:
public sealed class AutomapServiceBehavior : Attribute, IServiceBehavior
{
#region IServiceBehavior Members
public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints, BindingParameterCollection
bindingParameters)
{
AutomapBootstrap.InitializeMap();
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
#endregion
}
静态Automapper初始化类AutomapBootstrap:
public class AutomapBootstrap
{
public static void InitializeMap()
{
Mapper.Initialize(config =>
{
config.CreateMap<Supplier, IEdiPartnerData>();
config.CreateMap<IEdiPartnerData, Supplier>();
config.CreateMap<IEdiPartner, EdiPartner>();
});
}
}
也许你们可以帮助我。我不明白为什么它适用于旧版本而不适用于新版本。有没有更好的方法在 WCF 服务中初始化 Automapper?
提前谢谢, 桑德罗
【问题讨论】:
-
顺便说一句,
ConcurrencyMode.Multiple在InstanceContextMode = InstanceContextMode.PerCall时毫无意义。无法共享服务器 -
不确定它是否与您的问题有关,但您可以更改冗余的供应商-IEdiPartnerData 映射(来回)并改用
config.CreateMap<Supplier, IEdiPartnerData>().ReverseMap()。 -
@MickyD 见codeproject.com/Articles/89858/…
-
@Edword thx,不知道这个方法
-
因为老版本没扔。但是你的代码还是被破坏了。
标签: c# .net wcf automapper