ASP.NET MVC控制器中如何使用AutoMapper?Unity注入IMapper报错如何解决?
问题根源
当前报错为Ninject容器的绑定缺失提示,说明你项目实际用于接管ASP.NET MVC控制器实例化的依赖注入容器是Ninject,而非你手动创建的UnityContainer,你单独初始化的Unity实例没有实际生效,自然没办法注入IMapper到控制器。
解决方法
两种方案二选一即可,不要同时混用两个DI容器:
方案1:继续使用Ninject(无需引入Unity)
- 删掉你现在在
Application_Start里写的Unity相关代码 - 找到项目中Ninject的服务注册代码(通常在
NinjectWebCommon.cs的RegisterServices方法内),添加IMapper的绑定:
// 先初始化AutoMapper MapperConfiguration config = AutoMapperConfig.Configure(); IMapper mapper = config.CreateMapper(); // 绑定IMapper单例 kernel.Bind<IMapper>().ToConstant(mapper);
方案2:改用Unity作为DI容器
- 先卸载项目内所有Ninject相关的NuGet包和配置代码,避免容器冲突
- 安装对应你项目MVC版本的NuGet包
Unity.Mvc - 修改
Application_Start内的代码,将Unity设置为MVC的依赖解析器:
MapperConfiguration config = AutoMapperConfig.Configure(); IMapper mapper = config.CreateMapper(); var container = new UnityContainer(); // 注册IMapper单例 container.RegisterInstance<IMapper>(mapper); // 注册所有控制器 container.RegisterTypes( AllClasses.FromLoadedAssemblies().Where(t => typeof(Controller).IsAssignableFrom(t)), WithMappings.None ); // 设置MVC依赖解析器 DependencyResolver.SetResolver(new UnityDependencyResolver(container));
额外注意项
- 你当前
AutoMapperConfig.cs里的cfg.CreateMap<OrderDTO, Order>()代码末尾缺少分号,需要补上,否则会编译报错 - 如果有多组实体映射,统一在AutoMapperConfig的Configure方法里添加即可,不需要重复初始化Mapper配置
内容的提问来源于stack exchange,提问作者Mihir
相关产品推荐
相关产品推荐

