无源Automapper Resolver技术问询:为基页模型添加分类导航链接
使用AutoMapper Resolver为基页模型添加分类导航链接
看起来你正在用AutoMapper的自定义Resolver来动态给基页模型注入分类导航数据,我来帮你梳理这个实现的核心要点以及补全代码细节:
首先是完整的Resolver实现代码:
public sealed class CategoryNavigationResolver : IMemberValueResolver<object, object, string, ICollection<ProductCategoryModel>> { public ICollection<ProductCategoryModel> Resolve(object source, object destination, string sourceMember, ICollection<ProductCategoryModel> destMember, ResolutionContext context) { // 获取分类处理服务实例 IProductCategoryHandler productCategoryHandler = DependencyResolver.Current.GetService<IProductCategoryHandler>(); // 调用服务获取分类数据,可根据sourceMember传递的参数做针对性过滤 var categoryData = productCategoryHandler.GetNavigationCategories(sourceMember); // 转换为目标模型集合并返回,AutoMapper会自动赋值给页模型的对应属性 return categoryData?.Select(c => new ProductCategoryModel { Id = c.Id, Name = c.Name, Url = c.Url // 可根据你的ProductCategoryModel补充其他属性映射逻辑 }).ToList() ?? new List<ProductCategoryModel>(); } }
接下来是几个关键细节说明:
- 泛型参数含义:
IMemberValueResolver<object, object, string, ICollection<ProductCategoryModel>>的四个泛型分别对应:源对象类型、目标页模型类型、传递给Resolver的源成员参数类型(这里用string可传递分类标识等上下文参数)、目标页模型中分类导航属性的类型 - 服务获取优化:通过
DependencyResolver.Current获取服务是传统ASP.NET的方式,如果是ASP.NET Core项目,更推荐给Resolver的构造函数注入依赖,更符合依赖注入的最佳实践 - 映射配置关联:需要在AutoMapper配置中把这个Resolver和基页模型的分类导航属性绑定,示例如下:
CreateMap<YourSourceEntity, BasePageModel>() .ForMember(dest => dest.CategoryNavigation, opt => opt.MapFrom<CategoryNavigationResolver>(src => src.CategoryFilterParam));
这样每次AutoMapper从源对象映射到基页模型时,都会自动调用这个Resolver填充分类导航数据,避免了在每个页面逻辑里重复编写分类获取代码,实现了逻辑复用。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

