web-dev-qa-db-fra.com

Exception Automapper: "Configuration de type manquant ou mappage non pris en charge."

J'essaie d'utiliser Ninject dans une application ASP.NET MVC 5 qui utilise AutoMapper pour mapper le modèle sur le modèle d'affichage et vice versa . Malheureusement, un message d'erreur indiquant que la configuration de la mappe de type est manquante est manquant.

J'ai créé un résolveur de dépendance 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>();
        }
    }
}

J'utilise ceci pour créer un contrôleur:

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

Ceci appelle la configuration 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();
        }
    }
}

Quand j'exécute ceci, j'obtiens le message d'erreur suivant:

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

Est-ce que quelque chose me manque ... Cela fonctionnait bien avant d’utiliser le résolveur de dépendances Ninject ... Il ne semble plus y avoir de correspondances.


Modifier:

Si j'ajoute la création de mappage directement à la méthode du contrôleur, cela fonctionne:

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

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

La cartographie elle-même, les modèles et les modèles de vue ne semblent pas être le problème. J'imagine que le programme ne trouve pas les correspondances.

Même si j'appelle la configuration Web Auto Mapper dans la méthode du contrôleur, cela fonctionne: 

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

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

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

Vous devez également ajouter le mappage inverse. Vous pouvez le faire de deux manières:

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

ou d'un coup, comme ça:

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

Ce dernier est préférable si vous me demandez.

12
Joseph Woodward

N'appelez pas Mapper.CreateMap dans votre profil. Appelez base.CreateMap et vous serez prêt à:

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

Mapper.Initialize() doit être utilisé strictement une fois par solution.

Si vous appelez Initialize() quelque part plus tard, il remplacera tous vos mappages précédents . Inspectez votre code attentivement, devinez, vous trouverez un appel de cette méthode ailleurs. 

P.S .: Ce n’était pas le comportement initial d’Automapper de bonne heure, comme je pouvais le voir dans des morceaux de code créés il ya 3 ans et plus sur GitHub. 

1
rock_walker

J'ai eu un problème similaire, j'ai oublié de m'inscrire au Global.asax

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


        AutoMapperConfig.RegisterMappings();

    }
}
0
Melqui Franco

Dans mon cas, le problème était que certains mappages Automapper par défaut étaient enregistrés avec l'IoC.

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

Les mappages qui échouaient étaient enregistrés à un endroit différent, la configuration du service

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

Le projet recevait cette erreur était un projet test où la configuration du service n'a pas été exécutée. Lors du débogage, on avait l’illusion que les mappages défaillants étaient enregistrés, comme c’est le cas de ceux issus des mappages IoC.

Solution, assurez-vous que tous les mappages ont été enregistrés dans la solution de test.

0
Riga