AutoMapper無(wú)法通過(guò)反射創(chuàng)建IMemberValueResolver的實(shí)例

我收到一個(gè)錯(cuò)誤:AutoMapper v11.0.1無(wú)法創(chuàng)建自定義IMemberValueResolver類型的實(shí)例。

這是我的自定義解析器:

public class FooCollectionResolver<TModel, TViewModel> : IMemberValueResolver<object, object, BlockListModel?, IEnumerable<TViewModel>?>
 where TModel : class, IPublishedElement
 where TViewModel : class
{
    public IEnumerable<TViewModel>? Resolve(object source, object destination, BlockListModel? sourceMember, IEnumerable<TViewModel>? destMember, ResolutionContext context)
    { }
}

它接受源BlockListModel成員并返回TViewModel的集合。

Example usage:

this.CreateMap<FooModel, FooViewModel>().ForMember(
dest => dest.BlockListModelMember,
src => src.MapFrom<FooCollectionResolver<FooCollectionModel, FooCollectionViewModel>, BlockListModel>(s => s.BlockListModelMember));

FooModel.cs:

public class FooModel 
{
    public string Title { get; set; }
    public BlockListModel BlockListModelMember { get; set; }
}

FooViewModel.cs

public class FooViewModel 
{
   public string Title { get; set; }
   public IEnumerable<FooCollectionViewModel> BlockListModelMember { get; set; }
}

FooCollectionModel.cs

public class FooCollectionModel 
{
    public string FooMember { get; set; }
}

FooCollectionViewModel.cs

public class FooCollectionViewModel 
{
    public string FooMember { get; set; }
}

DI的注冊(cè)方式如下:

services.AddAutoMapper(cfg =>
        {
            cfg.AddMaps(new[]
            {
                "FooNamespace.Web",
                "FooNamespace.Web.Framework",
            });
        });

此特定映射配置文件包含在FooNamespace.Web中。此配置文件中的任何其他地圖都沒(méi)有問(wèn)題。

AutoMapper拋出一個(gè)錯(cuò)誤,它無(wú)法在運(yùn)行時(shí)創(chuàng)建FooCollectionResolver的實(shí)例。我相信它試圖在使用泛型.MapFrom<T>方法時(shí)通過(guò)反射創(chuàng)建實(shí)例。

Exception:

AutoMapperMappingException:無(wú)法創(chuàng)建GPE.Web.Framework.Mapping.ValueResolvers.FooCollectionResolver`2[FooCollectionModel,FooCollectionViewModel]類型的實(shí)例

AutoMapper.ResolutionContext.CreateInstance(Type type)

AutoMapperMappingException:映射類型時(shí)出錯(cuò)。

映射類型:FooModel->FooViewModel

類型映射配置:FooModel->FooViewModel

Destination Member: BlockListModelMember

有人知道這是為什么嗎?

我可以使用內(nèi)聯(lián)解析函數(shù)e.g實(shí)現(xiàn)這一點(diǎn):

this.CreateMap<FooModel, FooViewModel>()
                .ForMember(
                dest => dest.BlockListModelMember,
                src => src.MapFrom((src, dest, destMember, context) =>
                {
                    // mapping logic
                }));

但是我想重用這個(gè)邏輯,因?yàn)樗菓?yīng)用于不同模型的相同的通用模式,因此泛型IMemberValueResolver

? 最佳回答:

當(dāng)您使用services.AddAutoMapper的特定重載時(shí),它不會(huì)將值解析程序添加到容器中。您可以改用此方法,它將掃描程序集以查找所有相關(guān)類型:

services.AddAutoMapper(
    typeof(FooCollectionResolver<,>).Assembly,
    typeof(SomeOtherType).Assembly /*, more if required */);

如果您查看AddAutoMapperClasses的實(shí)現(xiàn),這是AddAutoMapper擴(kuò)展方法最終調(diào)用的內(nèi)容,您會(huì)發(fā)現(xiàn),如果它傳遞了assembliesToScan的集合,它只注冊(cè)IMemberValueResolver類型(以及其他類型)。

您正在使用的重載傳遞了該參數(shù)null,因此它們不會(huì)被注冊(cè)。

主站蜘蛛池模板: 中文字幕无线码一区2020青青| 亚洲Av无码一区二区二三区| 国产麻豆精品一区二区三区 | 国产SUV精品一区二区四| 精品91一区二区三区| 色噜噜狠狠一区二区| 日本精品一区二区三区在线观看| 国模精品视频一区二区三区| 无码av免费毛片一区二区| 久久无码人妻一区二区三区| 国模无码一区二区三区不卡| 国产精品毛片a∨一区二区三区| 精品国产亚洲一区二区三区在线观看 | 在线精品国产一区二区| 99国产精品一区二区| 亚洲第一区在线观看| 一区五十路在线中出| 一区二区三区无码高清视频| 国产乱子伦一区二区三区| 国产精品熟女视频一区二区| 春暖花开亚洲性无区一区二区| 中文字幕一区日韩精品| 在线观看日本亚洲一区| 亚洲色无码专区一区| 无码人妻精品一区二区三区不卡 | 一区在线观看视频| 亚洲一区无码精品色| 精品人妻一区二区三区毛片| 精品国产一区二区三区久久蜜臀| 丝袜人妻一区二区三区网站 | 国产精品免费综合一区视频| 国产精品一区二区四区| 日本精品一区二区三区在线视频| 国产人妖在线观看一区二区| 精品视频一区在线观看| 精品国产日韩亚洲一区| 无码一区二区三区老色鬼| 一本一道波多野结衣一区| 国产精品一区不卡| 国产亚洲一区二区在线观看| 亚洲午夜在线一区|