Automapper 10搭配Simple Injector v5配置报SimpleInjector.ActivationException
问题解决方案
该异常与AutoMapper官方文档无关,是SimpleInjector v5的默认配置限制,以及缺失对应类型注册导致的。
问题根源
你的GetMapper方法中调用了container.GetInstance<MapperProvider>()获取实例,但没有在容器中注册MapperProvider类型。SimpleInjector v5默认将ResolveUnregisteredConcreteTypes设置为false,禁止容器自动构造未注册的具体类型,因此抛出该激活异常。
修复方案
方案1:补注册MapperProvider(最小改动)
直接在你的Register方法中添加MapperProvider的注册即可,修改后的注册逻辑如下:
public static void Register(Container container) { // 新增这行注册MapperProvider container.Register<MapperProvider>(); container.RegisterSingleton(() => GetMapper(container)); // 其他原有注册逻辑 ... }
方案2:移除多余的MapperProvider层(推荐)
你完全不需要额外封装MapperProvider类,可以直接在IMapper的注册委托中完成配置构建,避免多一层类型依赖:
public static void Register(Container container) { container.RegisterSingleton<IMapper>(() => { var config = new MapperConfigurationExpression(); config.ConstructServicesUsing(container.GetInstance); config.AllowNullDestinationValues = true; config.AllowNullCollections = true; config.CreateMap<TeamModel, PoolTeamExtendedModel>(); var mapperConfig = new MapperConfiguration(config); mapperConfig.AssertConfigurationIsValid(); return new Mapper(mapperConfig, t => container.GetInstance(t)); }); // 其他原有注册逻辑 ... }
额外优化建议
MapperConfiguration是线程安全的重量级对象,建议全局只初始化一次,不要每次解析IMapper都重新构建配置,避免不必要的性能损耗。
内容的提问来源于stack exchange,提问作者Mike Flynn
相关产品推荐
相关产品推荐

