我收到一個錯誤,AutoMapper v11.0.1無法創建自定義IMemberValueResolver型別的實體。
這是我的自定義決議器:
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.
示例用法:
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 的注冊方式:
services.AddAutoMapper(cfg =>
{
cfg.AddMaps(new[]
{
"FooNamespace.Web",
"FooNamespace.Web.Framework",
});
});
此特定映射組態檔包含在FooNamespace.Web. 此組態檔中的任何其他地圖都沒有問題。
AutoMapper引發無法FooCollectionResolver在運行時創建實體的錯誤。.MapFrom<T>我相信它在使用泛型方法時會嘗試通過反射創建一個實體。
例外:
AutoMapperMappingException:無法創建 GPE.Web.Framework.Mapping.ValueResolvers.FooCollectionResolver`2[FooCollectionModel,FooCollectionViewModel] 型別的實體
AutoMapper.ResolutionContext.CreateInstance(型別型別)
AutoMapperMappingException:錯誤映射型別。
映射型別:FooModel -> FooViewModel
型別映射配置:FooModel -> FooViewModel
目標成員:BlockListModelMember
有人知道為什么嗎?
我可以使用行內決議功能來解決這個問題,例如:
this.CreateMap<FooModel, FooViewModel>()
.ForMember(
dest => dest.BlockListModelMember,
src => src.MapFrom((src, dest, destMember, context) =>
{
// mapping logic
}));
但我想重用這個邏輯,因為它與適用于各種不同模型的通用模式相同,因此通用IMemberValueResolver
uj5u.com熱心網友回復:
當您使用它的特定多載時services.AddAutoMapper,不會將您的值決議器添加到容器中。您可以使用它來掃描程式集以查找所有相關型別:
services.AddAutoMapper(
typeof(FooCollectionResolver<,>).Assembly,
typeof(SomeOtherType).Assembly /*, more if required */);
如果您查看AddAutoMapperClasses的實作,這是AddAutoMapper擴展方法最終呼叫的內容,您會發現它只注冊IMemberValueResolver型別(以及其他型別),如果它傳遞了一個assembliesToScan.
您正在使用的多載傳遞null此引數,因此它們不會被注冊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519879.html
標籤:C#仿制药自动映射器
