【问题标题】:Automapper custom resolver throws null exceptionAutomapper 自定义解析器抛出空异常
【发布时间】:2015-01-30 16:44:01
【问题描述】:

所以我有一个运行良好的移动服务,并且想要添加 DTO 符号。 我使用 AutoMapper 在我的模型和 DTO 模型之间进行映射,但是数据库的复杂性和我想要的结果迫使我使用自定义解析器,这反过来又会引发空异常。

具体来说——映射器初始化

Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Contact, MobileContact>()
                .ForMember(mobcont => mobcont.Favorite, map => map.ResolveUsing<ContactResolver>());//.UseValue(true));//
            cfg.CreateMap<MobileContact, Contact>();
        });

我的自定义解析器是

public class ContactResolver :  ValueResolver<Contact, bool> 
{
    protected override bool ResolveCore(Contact a)
    {
        return true;
    }
}

已编辑:收藏夹当然是布尔值

如果我不使用自定义解析器并使用 .UseValue(true) 就可以了

尽管如上所示的自定义解析器的常见 get 请求会引发以下异常:

Exception=System.NullReferenceException: Object reference not set to an instance of an object.
   at AutoMapper.QueryableExtensions.Extensions.ResolveExpression(PropertyMap propertyMap, Type currentType, Expression instanceParameter)
   at AutoMapper.QueryableExtensions.Extensions.CreateMemberBindings(IMappingEngine mappingEngine, TypePair typePair, TypeMap typeMap, Expression instanceParameter, IDictionary`2 typePairCount)
   at AutoMapper.QueryableExtensions.Extensions.CreateMapExpression(IMappingEngine mappingEngine, TypePair typePair, Expression instanceParameter, IDictionary`2 typePairCount)
   at AutoMapper.QueryableExtensions.Extensions.CreateMapExpression(IMappingEngine mappingEngine, TypePair typePair, IDictionary`2 typePairCount)
   at AutoMapper.QueryableExtensions.Extensions.<>c__DisplayClass1`2.<CreateMapExpression>b__0(TypePair tp)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at AutoMapper.Internal.DictionaryFactoryOverride.ConcurrentDictionaryImpl`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at AutoMapper.QueryableExtensions.Extensions.CreateMapExpression[TSource,TDestination](IMappingEngine mappingEngine)
   at AutoMapper.QueryableExtensions.ProjectionExpression`1.To[TResult]()
   at Microsoft.WindowsAzure.Mobile.Service.MappedEntityDomainManager`2.Query()
   at azmobtestService.Models.MobileContactDomainManager.Query() in c:\Users\n.atlas\Source\Repos\JPhoneBook\Service\azmobtestService\Models\MobileContactDomainManager.cs:line 104
   at Microsoft.WindowsAzure.Mobile.Service.TableController`1.Query(), Id=75849f58-ccb0-4a6b-8a77-491f13fcb717, Category='App.Controllers.Tables'

【问题讨论】:

    标签: c# automapper azure-mobile-services dto


    【解决方案1】:

    如果您所做的只是在所有情况下将喜爱解析为 true(这是不对的,但这是您提供的代码,所以我将使用它),那么您的映射器可能只是 .ForMember(mobcont =&gt; mobcont.Favorite, expression =&gt; expression.MapFrom(source =&gt; true));

    如果您正在寻找普通值解析器,我会使用这样的 ITypeConverter:

    public class ContactToMobileContactTypeConverter : ITypeConverter<Contact, MobileContact>
    {
        public MobileContact Convert(ResolutionContext context)
        {
             var contact = (Contact)context.SourceValue;
    
             var mobileContact = new MobileContact();
             if(contact != null) {
                 //database query
                 //assign values
             }
             return mobileContact;
        }
    }
    

    【讨论】:

    • 我使用 AutoMapper 在我的模型和 DTO 模型之间进行映射,但是数据库的复杂性和我想要的结果迫使我使用自定义解析器,这又会引发空异常。当然,我不想将其设置为 true!我想发出一个数据库请求并在收藏夹表中搜索一行并将其设置为该值。如您所见,此搜索基于用户身份验证(每个用户的每个联系人都有多行收藏)。
    • 我编辑了一些应该可以工作的代码,但我相信你必须做很多工作才能让它按照你想要的方式工作。
    • 将配置更改为:cfg.CreateMap().ConvertUsing(new ContactToMobileContactTypeConverter()); cfg.CreateMap();并添加了您提供的代码。调试显示从未执行转换方法!新日志是:LINQ to Entities 不支持指定的类型成员“Id”。仅支持初始化程序、实体成员和实体导航属性。在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MemberAccessTranslator.TypedTranslate(ExpressionConverter parent,MemberExpression linq)... 更多
    • 您是否在测试中将类型联系人转换为移动联系人?代码应该类似于 var mobileContact = _mappingEngine.Map&lt;MobileContact&gt;(aContact);
    • 我使用 MappedEntityDomainManager 分配给 TableController 并且我只是发出一个 get 请求。我认为它应该即时进行转换。但是让我检查一下
    猜你喜欢
    • 2014-03-27
    • 2012-02-04
    • 2011-10-06
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2020-04-17
    相关资源
    最近更新 更多