我遇到了几个问题,但都不能正确处理。
当尝试使用WCF7.0时,我得到了一个Mapper not initialized异常-尽管我认为我的问题与AutoMapper无关,而是与我尝试将服务注册到我的WCF中的方式有关。
我关注了this的文章,为我的AutoMapper创建了一个ServiceBehavior:
public sealed class AutomapServiceBehavior : Attribute, IServiceBehavior
{
public AutomapServiceBehavior()
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
AutomapBootstrap.InitializeMap();
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
}然后将断点添加到AutomapBootstrap.InitializeMap() (如下所示):
public class AutomapBootstrap
{
public static void InitializeMap()
{
//BREAKPOINT ADDED HERE
var config = new MapperConfiguration(cfg =>
cfg.CreateMap<ClassA, ClassB>()
);
var mapper = new Mapper(config);
}
}我认为应用程序应该在启动时在断点处停止,但它没有。我错过了什么?
发布于 2019-10-02 06:21:16
首先,您需要确保将Annotation添加到服务中,以便首先调用行为
[AutomapServiceBehavior] <-------
[ServiceErrorBehavior(typeof(ElmahErrorHandler))]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DVDService : IDVDService
{其次,初始化映射器的方式是将其分配给一个var,然后初始化程序完成,这样var就会超出作用域并被垃圾回收,即使在那篇文章中的示例中,我也怀疑他是否测试了它,因为他的初始化程序没有调用适当的方法来存储映射器。
在9.0之前,你可以这样初始化它
Mapper.Initialize(cfg =>
{
cfg.CreateMap<ClassA, ClassB>();
});
Mapper.AssertConfigurationIsValid();这将在运行时存储映射器的静态副本,可以在系统中的任何位置静态访问,通常您会在启动时调用它,而不是在服务定义中,因为它只需要运行一次。这样,您根本不需要在服务定义中调用它。它在你的整个应用程序中都可用。你就叫它像这样
var result = Mapper.Map<ClassB>(classA);在9.0之后,他们删除了静态应用程序接口,你需要使用依赖注入,或者你可以在How to use AutoMapper 9.0.0 in Asp.Net Web Api 2 without dependency injection?上看看我的答案,看看如何解决这个问题。
https://stackoverflow.com/questions/58117578
复制相似问题