首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用ServiceBehavior引导服务(AutoMapper“映射器未初始化”)

无法使用ServiceBehavior引导服务(AutoMapper“映射器未初始化”)
EN

Stack Overflow用户
提问于 2019-09-26 21:10:48
回答 1查看 59关注 0票数 0

我遇到了几个问题,但都不能正确处理。

当尝试使用WCF7.0时,我得到了一个Mapper not initialized异常-尽管我认为我的问题与AutoMapper无关,而是与我尝试将服务注册到我的WCF中的方式有关。

我关注了this的文章,为我的AutoMapper创建了一个ServiceBehavior:

代码语言:javascript
复制
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() (如下所示):

代码语言:javascript
复制
public class AutomapBootstrap
    {
        public static void InitializeMap()
        {
            //BREAKPOINT ADDED HERE
            var config = new MapperConfiguration(cfg =>
               cfg.CreateMap<ClassA, ClassB>()
            );
            var mapper = new Mapper(config);

        }
    }

我认为应用程序应该在启动时在断点处停止,但它没有。我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-02 06:21:16

首先,您需要确保将Annotation添加到服务中,以便首先调用行为

代码语言:javascript
复制
[AutomapServiceBehavior]  <-------
[ServiceErrorBehavior(typeof(ElmahErrorHandler))]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DVDService : IDVDService
{

其次,初始化映射器的方式是将其分配给一个var,然后初始化程序完成,这样var就会超出作用域并被垃圾回收,即使在那篇文章中的示例中,我也怀疑他是否测试了它,因为他的初始化程序没有调用适当的方法来存储映射器。

在9.0之前,你可以这样初始化它

代码语言:javascript
复制
 Mapper.Initialize(cfg =>
 {
     cfg.CreateMap<ClassA, ClassB>();
 });
 Mapper.AssertConfigurationIsValid();

这将在运行时存储映射器的静态副本,可以在系统中的任何位置静态访问,通常您会在启动时调用它,而不是在服务定义中,因为它只需要运行一次。这样,您根本不需要在服务定义中调用它。它在你的整个应用程序中都可用。你就叫它像这样

代码语言:javascript
复制
var result = Mapper.Map<ClassB>(classA);

在9.0之后,他们删除了静态应用程序接口,你需要使用依赖注入,或者你可以在How to use AutoMapper 9.0.0 in Asp.Net Web Api 2 without dependency injection?上看看我的答案,看看如何解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58117578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档