web-dev-qa-db-de.com

Automapper-Ausnahme: "Fehlende Typzuordnungskonfiguration oder nicht unterstützte Zuordnung."

Ich versuche, Ninject in einer ASP.NET MVC 5-Anwendung zu verwenden, die AutoMapper für die Zuordnung des Modells zum Ansichtsmodell und umgekehrt verwendet .. Leider bekomme ich eine Fehlermeldung, die besagt, dass die Typzuordnungskonfiguration fehlt.

Ich habe einen Ninject-Abhängigkeitsauflöser erstellt:

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>();
        }
    }
}

Ich benutze das, um einen Controller zu erstellen:

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();
        }
    }
}

Dies ruft die AutoMapper-Konfiguration auf:

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();
        }
    }
}

Wenn ich das ausführen, erhalte ich die folgende Fehlermeldung:

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

Vermisse ich etwas . Es hat gut funktioniert, bevor ich den Ninject-Abhängigkeitsauflöser verwendet habe . Jetzt scheint es nicht, die Zuordnungen zu finden.


Bearbeiten:

Wenn ich die Mapping-Erstellung direkt zur Controller-Methode hinzufüge, funktioniert es:

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

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

Das Mapping selbst und die Modelle und Ansichtsmodelle scheinen nicht das Problem zu sein. Ich vermute mal, dass das Programm die Zuordnungen irgendwie nicht findet.

Selbst wenn ich die Auto Mapper Web Configuration in der Controller-Methode aufrufe, funktioniert es: 

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

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

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

Sie müssen auch die umgekehrte Zuordnung hinzufügen. Sie haben zwei Möglichkeiten:

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

oder auf einmal wie folgt:

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

Letzteres ist vorzuziehen, wenn Sie mich fragen.

12
Joseph Woodward

Rufen Sie Mapper.CreateMap nicht in Ihrem Profil auf. Rufen Sie base.CreateMap auf, und Sie sind festgelegt:

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

Mapper.Initialize() sollte ausschließlich einmalig pro Lösung verwendet werden.

Wenn Sie Initialize() später aufrufen, werden alle vorherigen Zuordnungen überschrieben Überprüfen Sie den Code aufmerksam. Erraten Sie, ein Aufruf dieser Methode wird an einem anderen Ort angezeigt. 

P.S .: Das war ursprünglich nicht das erste Verhalten von Automapper, wie ich in Codeteilen sehen konnte, die vor 3 und mehr Jahren auf GitHub erstellt wurden. 

1
rock_walker

Ich hatte ein ähnliches Problem, ich habe vergessen, mich bei Global.asax anzumelden

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


        AutoMapperConfig.RegisterMappings();

    }
}
0
Melqui Franco

In meinem Fall bestand das Problem darin, dass einige Standard-Automapper-Zuordnungen beim IoC registriert wurden.

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

Die fehlgeschlagenen Zuordnungen wurden an einer anderen Stelle, der Dienstkonfiguration, registriert

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

Das Projekt war, diesen Fehler zu bekommen, war ein Testprojekt, bei dem die Servicekonfiguration nicht ausgeführt wurde. Beim Debugging hatte man die Illusion, dass die fehlerhaften Zuordnungen registriert wurden, wie dies bei den IoC-Zuordnungen der Fall war.

Lösung, stellen Sie sicher, dass alle Zuordnungen in der Testlösung registriert wurden.

0
Riga