自动映射例外:"缺少类型映射配置或不支持的映射。"

时间:2015-01-23 22:03:44

标签: c# dependency-injection asp.net-mvc-5 ninject automapper

我正在尝试在ASP.NET MVC 5应用程序中使用Ninject,该应用程序使用AutoMapper将模型映射到视图模型,反之亦然。 不幸的是,我收到一条错误消息,指出缺少类型映射配置。

我创建了一个Ninject依赖项解析器:

namespace MyNamespace.Infrastructure
{
    public class NinjectDependencyResolver: IDependencyResolver
    {
        private IKernel kernel;

        public NinjectDependencyResolver(IKernel kernelParam)
        {
            kernel = kernelParam;
            AddBindings();
        }

        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }

        private void AddBindings()
        {
            kernel.Bind<IMyBLL>().To<MyBLL>();
        }
    }
}

我用它来创建一个控制器:

namespace MyNamespace.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        private IMyBLL _myBLL;

        public HomeController(IMyBLL myBLLParam)
        {
            _myBLL = myBLLParam;
        }

        public PartialViewResult AddRecord()
        {
            return PartialView(new AddRecordViewModel());
        }

        [HttpPost]
        public void AddRecord(AddRecordViewModel recordViewModel)
        {
            var record = Mapper.Map<Record>(recordViewModel);

            _myBLL.AddRecord(record, User.Identity.Name);
        }
    }
}

的Global.asax:

namespace MyNamespace.WebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            ApplicationUserManager.StartupAsync();
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AutoMapperWebConfiguration.Configure();
        }
    }
}

这会调用AutoMapper配置:

namespace MyNamespace.WebApplication.Infrastructure
{
    public static class AutoMapperWebConfiguration
    {
        public static void Configure()
        {
            Mapper.Initialize(cfg => cfg.AddProfile(new RecordProfile()));
        }
    }

    public class RecordProfile : Profile
    {
        protected override void Configure()
        {
            Mapper.CreateMap<AddRecordViewModel, Record>().ReverseMap();
        }
    }
}

当我运行此命令时,我收到以下错误消息:

Missing type map configuration or unsupported mapping.

Mapping types:
AddRecordViewModel -> Record
 MyNamespace.WebApplication.ViewModels.Home.AddRecordViewModel -> MyNamespace.Model.Record

 Destination path:
 Record

 Source value:
 MyNamespace.WebApplication.ViewModels.Home.AddRecordViewModel

我是否想念一些东西。 在使用Ninject依赖项解析器之前,它工作正常。 现在它似乎没有找到映射。


编辑:

如果我将Mapping Creation直接添加到控制器方法,它可以工作:

[HttpPost]
public void AddRecord(AddRecordViewModel recordViewModel)
{
    Mapper.CreateMap<AddRecordViewModel, Record>().ReverseMap();
    var record = Mapper.Map<Record>(recordViewModel);

    _myBLL.AddRecord(record, User.Identity.Name);
}

映射本身以及模型和视图模型似乎不是问题。我猜这个程序以某种方式找不到映射。

即使我在控制器方法中调用自动映射器Web配置,它仍然有效:

public void AddRecord(AddRecordViewModel recordViewModel)
{
    Infrastructure.AutoMapperWebConfiguration.Configure();

    var record = Mapper.Map<Record>(recordViewModel);

    _myBLL.AddRecord(record, User.Identity.Name);
}

5 个答案:

答案 0 :(得分:12)

您还需要添加反向映射。您可以采用以下两种方式之一:

Mapper.CreateMap<AddRecordViewModel, Record>();
Mapper.CreateMap<Record, AddRecordViewModel>();

或者像这样:

Mapper.CreateMap<AddRecordViewModel, Record>().ReverseMap();

如果你问我,后者更可取。

答案 1 :(得分:4)

不要在个人资料中调用Mapper.CreateMap。调用base.CreateMap,然后设置:

public class RecordProfile : Profile
{
    protected override void Configure()
    {
        base.CreateMap<AddRecordViewModel, Record>().ReverseMap();
    }
}

答案 2 :(得分:1)

Mapper.Initialize()每个解决方案应严格一次

如果稍后在某处调用Initialize(),它将覆盖以前的所有映射。 仔细检查你的代码,猜测,你会在另一个地方找到这种方法的调用。

P.S。:早期的Automapper并没有初始行为,正如我在GitHub上3年多前创建的代码片段中所看到的那样。

答案 3 :(得分:0)

我有类似的问题,我忘记在Global.asax中注册

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {


        AutoMapperConfig.RegisterMappings();

    }
}

答案 4 :(得分:0)

在我的情况下,问题是某些默认的Automapper映射已在IoC中注册。

builder.Register(_ => AutomapperConfiguration.Configure()).As<IMapper>().SingleInstance();

失败的映射在不同的位置注册,即服务配置

static void Main(string[] args)
{
    var container = ConfigureDependencies();
    AutoMapping.Configure();

该项目正在获得此错误是一个未执行服务配置的测试项目。调试时有错误的映射失败的映射,可以看到来自IoC映射的映射。

解决方案,确保所有映射都已在测试解决方案中注册。