Я изо всех сил пытаюсь понять, что я здесь делаю неправильно.Я использовал Automapper + Automapper.Attributes (https://github.com/schneidenbach/AutoMapper.Attributes) в решении, и недавно мне пришлось разделить мой проект API на «базовую» библиотеку и исходный API. Automapper не может создатькарта, когда файлы классов перемещаются за пределы проекта API. Я установил демонстрационный проект со следующей структурой для подтверждения этой проблемы: (Доступно здесь: https://github.com/greghesom/AutoMapper_Example)
- Решение
- API (класс клиента и человека)
- API.Core (классы домашних животных и собак)
- Проект API ссылается на API.Core
- Класс Pet соответствует классу Dog
- Класс Person соответствует классу Customer
API.Core - класс Dog
namespace API.Core
{
public class Dog
{
public string Name { get; set; }
}
}
API.Core - класс питомца
namespace API.Core
{
[MapsTo(typeof(Dog))]
public class Pet
{
[MapsToProperty(typeof(Dog), "Name")] //Edit: Fixed this typo
public string PetName { get; set; }
}
}
API - класс персонажа
namespace API.Models
{
[MapsTo(typeof(Customer))]
public class Person
{
[MapsToProperty(typeof(Customer), "FirstName")]
public string Name { get; set; }
}
}
API - класс клиента
namespace API.Models
{
public class Customer
{
public string FirstName { get; set; }
}
}
API - запуск
AutoMapper.Mapper.Initialize(cfg => {
typeof(API.WebApiConfig).Assembly.MapTypes(cfg);
});
API - контроллер
var person = new Person { Name = "John" };
var customer = AutoMapper.Mapper.Map<Customer>(person);//This Works
var dog = new Dog { Name = "Lucky" };
var pet = AutoMapper.Mapper.Map<Pet>(dog);//This throws exception
ИСКЛЮЧЕНИЕ:
Произошла ошибка.Не нанесенные на карту участники были найдены.Просмотрите типы и членов ниже.Добавьте пользовательское выражение сопоставления, игнорируйте, добавьте пользовательский преобразователь или измените тип источника / назначения. Если нет подходящего конструктора, добавьте ctor без аргументов, добавьте необязательные аргументы или сопоставьте все параметры конструктора ============================= AutoMapper создал эту карту типов для вас, но ваши типы не могут быть сопоставлены с использованием текущей конфигурации.Dog -> Pet (список участников-получателей) API.Core.Dog -> API.Core.Pet (список членов-получателей)
Не отображенные свойства: PetName AutoMapper.AutoMapperConfigurationException at lambda_method (Closure, Dog, Pet, ResolutionContext)в lambda_method (Closure, Object, Object, ResolutionContext) в API.Controllers.ValuesController.Get () в c: \ users \ greg \ Source \ Repos \ AutoMapperTest \ API \ Controllers \ ValuesController.cs: строка 26 в lambda_method (Closure,Object, Object []) в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor. <> C__DisplayClass10. b__9 (Экземпляр объекта, Object [] methodParameters) в System.Web.Http.Controllers.ReflectedHttpActionTextor(Экземпляр объекта, аргументы Object []) в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync (аргументы HttpControllerContext controllerContext, IDictionary`2, CancellationToken cancellationToken) --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение--- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.Http.Controllers.--- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Web.Http.Controllers.ActionFilterResult. d__2.MoveNext () --- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача Task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.Web.Http.Dispatcher.HttpControllerDispatcher. d__1.MoveNext ()