自动映射器自定义解析程序引发空异常

本文关键字:程序 异常 映射 自定义 | 更新日期: 2023-09-27 18:32:43

所以我有一个运行良好的移动服务,并希望添加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;
    }
}

编辑:最喜欢的当然是布尔值

如果我不使用自定义解析程序并使用 .使用值(真(它工作得很好

尽管如上所示使用自定义解析程序的常见 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'

自动映射器自定义解析程序引发空异常

如果您所做的只是在所有情况下都将 favorite 解析为 true(这是不对的,但这是您提供的代码,所以我会使用它(,那么您的映射器可能只是.ForMember(mobcont => mobcont.Favorite, expression => expression.MapFrom(source => 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;
    }
}