如何用FreshMvvm和FreshIOC注入AutoMapper实例及解决注入崩溃问题
解决Xamarin.Forms + FreshMvvm中AutoMapper注入崩溃的问题
看起来你遇到的核心问题是AutoMapper相关服务没有正确注册到FreshMvvm依赖的TinyIoC容器中,导致解析IConfigurationProvider时失败。FreshMvvm默认用TinyIoC做DI管理,和普通.NET Core DI的注册逻辑略有差异,下面是具体的解决步骤:
1. 先确认AutoMapper配置的正确性
先创建你的AutoMapper配置文件(Profile),把映射规则统一管理起来:
public class AppMappingProfile : Profile { public AppMappingProfile() { // 示例:添加你的实体映射规则 CreateMap<UserDto, UserModel>(); CreateMap<OrderEntity, OrderViewModel>(); } }
2. 正确注册AutoMapper服务到TinyIoC
在App.xaml.cs的OnStart方法中,一定要在FreshMvvm解析ViewModel之前完成AutoMapper的初始化和容器注册:
protected override void OnStart() { // 1. 初始化AutoMapper全局配置 var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<AppMappingProfile>(); // 也可以直接在这里添加映射规则,用Profile类管理更清晰 }); // 可选但推荐:验证配置是否正确,提前排查映射错误 mapperConfig.AssertConfigurationIsValid(); // 2. 注册到TinyIoC容器 // 把IConfigurationProvider注册为单例(配置全局唯一) TinyIoCContainer.Current.Register<IConfigurationProvider>(mapperConfig); // 注册IMapper,通过工厂方法创建,确保它能拿到依赖的IConfigurationProvider TinyIoCContainer.Current.Register<IMapper>(() => mapperConfig.CreateMapper()); // 3. 最后初始化FreshMvvm的页面导航 var mainPage = FreshPageModelResolver.ResolvePageModel<MainPageModel>(); MainPage = new FreshNavigationContainer(mainPage); }
3. 在ViewModel中正确注入IMapper
通常我们不需要直接注入IConfigurationProvider,只需要注入IMapper即可:
public class MainPageModel : FreshBasePageModel { private readonly IMapper _mapper; // 构造函数注入IMapper public MainPageModel(IMapper mapper) { _mapper = mapper; } // 示例:使用AutoMapper进行对象映射 private void ProcessData() { var userDto = new UserDto { Id = 1, Nickname = "Alex" }; var userModel = _mapper.Map<UserModel>(userDto); // 后续业务逻辑... } }
为什么之前会崩溃?
你遇到的TinyIoCResolutionException: Resolve failed: IConfigurationProvider错误,本质是TinyIoC容器里没有这个服务的注册记录。AutoMapper的IMapper依赖IConfigurationProvider,如果注册顺序不对(先解析ViewModel再注册服务),或者没有正确把初始化好的配置实例注册到容器,都会导致依赖解析失败。
额外注意事项
- 确保共享项目和所有平台项目(iOS/Android)都安装了
AutoMapper和FreshMvvm的NuGet包,版本保持一致; - 不要在ViewModel中手动创建
Mapper实例,必须通过DI注入,保证全局配置的一致性; - 如果确实需要注入
IConfigurationProvider,也要像上面那样把初始化好的MapperConfiguration实例注册到容器中。
内容的提问来源于stack exchange,提问作者span
相关产品推荐
相关产品推荐

