Неважно, если это статический класс. Это все о конвенции .
Наше соглашение состоит в том, что каждый «слой» (веб, сервисы, данные) имеет один файл, называемый AutoMapperXConfiguration.cs
, с единственным методом Configure()
, который X
называется слоем.
Затем Configure()
метод вызывает private
методы для каждой области.
Вот пример нашей конфигурации веб-уровня:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
ConfigureUserMapping();
ConfigurePostMapping();
}
private static void ConfigureUserMapping()
{
Mapper.CreateMap<User,UserViewModel>();
}
// ... etc
}
Мы создаем метод для каждого «агрегата» (User, Post), чтобы все было хорошо разделено.
Тогда ваш Global.asax
:
AutoMapperWebConfiguration.Configure();
AutoMapperServicesConfiguration.Configure();
AutoMapperDomainConfiguration.Configure();
// etc
Это что-то вроде «интерфейса слов» - не может обеспечить его выполнение, но вы ожидаете этого, поэтому вы можете кодировать (и реорганизовывать) при необходимости.
РЕДАКТИРОВАТЬ:
Просто подумал, что упомяну, что теперь я использую профили AutoMapper , поэтому приведенный выше пример выглядит так:
public static class AutoMapperWebConfiguration
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile(new UserProfile());
cfg.AddProfile(new PostProfile());
});
}
}
public class UserProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<User,UserViewModel>();
}
}
Гораздо чище / надежнее.
Mapper.Initialize
в каждом классе конфигурации предыдущие добавленные профили? Если да, что следует использовать вместо Initialize?Mapper.CreateMap()
устарела.'Mapper.Map<TSource, TDestination>(TSource, TDestination)' is obsolete: 'The static API will be removed in version 5.0. Use a MapperConfiguration instance and store statically as needed. Use CreateMapper to create a mapper instance.'
, Как бы вы обновили свой пример, чтобы он соответствовал новым требованиям?Вы можете поместить его в любое место, если ваш веб-проект ссылается на сборку, в которой он находится. В вашей ситуации я бы поместил его на сервисный уровень, так как он будет доступен для веб-слоя и сервисного уровня, а позже, если вы решите Создайте консольное приложение или проект модульного тестирования, и конфигурация сопоставления будет доступна и для этих проектов.
В вашем Global.asax вы затем вызовете метод, который устанавливает все ваши карты. Увидеть ниже:
Файл AutoMapperBootStrapper.cs
Global.asax при запуске приложения
просто позвони
Теперь некоторые люди будут утверждать, что этот метод нарушает некоторые принципы SOLID, которые они имеют веские аргументы. Вот они для чтения.
Конфигурирование Automapper в Bootstrapper нарушает принцип Open-Closed?
источник
Обновление: опубликованный здесь подход больше не действителен, так как
SelfProfiler
был удален с AutoMapper v2.Я бы выбрал такой же подход, как и Тоаи. Но я бы использовал встроенный
SelfProfiler<>
класс для обработки карт, а затем использовалMapper.SelfConfigure
функцию для инициализации.Используя этот объект в качестве источника:
И это как пункт назначения:
Вы можете создать эти профили:
Для инициализации в вашем приложении создайте этот класс
Добавьте эту строку в ваш файл global.asax.cs:
AutoMapperConfiguration.Initialize()
Теперь вы можете размещать свои классы отображения там, где они имеют смысл, и не беспокоиться об одном монолитном классе отображения.
источник
Для тех из вас, кто придерживается следующего:
Я сделал комбо между профилями и используя мой контейнер ioc:
Конфигурация IoC:
Пример конфигурации:
Пример использования:
Компромисс заключается в том, что вы должны ссылаться на Mapper через интерфейс IMappingEngine вместо статического Mapper, но это соглашение, с которым я могу жить.
источник
Все вышеперечисленные решения предоставляют статический метод для вызова (из app_start или любого другого места), который он должен вызывать другими методами для настройки частей mapping-конфигурации. Но если у вас есть модульное приложение, эти модули могут подключаться и отключаться от приложения в любое время, эти решения не работают. Я предлагаю использовать
WebActivator
библиотеку, которая может зарегистрировать некоторые методы для запускаapp_pre_start
и вapp_post_start
любом месте:Вы можете установить
WebActivator
через NuGet.источник
MyModule1
проекте (или как там у вашего проекта) просто создайте класс с именемInitMapInModule1
и поместите код в файл; для других модулей сделайте то же самое.В дополнение к лучшему ответу, хорошим способом является использование библиотеки Autofac IoC для добавления некоторой автоматизации. При этом вы просто определяете свои профили независимо от инициаций.
и вызывая эту строку в
Application_Start
методе:Приведенный выше код находит все подклассы профиля и запускает их автоматически.
источник
Размещение всей логики сопоставления в одном месте не является хорошей практикой для меня. Потому что класс отображения будет очень большим и очень сложным в обслуживании.
Я рекомендую поместить сопоставление вместе с классом ViewModel в тот же файл cs. Вы можете легко перейти к определению отображения, которое вы хотите, следуя этому соглашению. Более того, при создании класса отображения вы можете ссылаться на свойства ViewModel быстрее, поскольку они находятся в одном файле.
Таким образом, ваш класс модели представления будет выглядеть так:
источник
В новой версии AutoMapper использование статического метода Mapper.Map () устарело. Таким образом, вы можете добавить MapperConfiguration в качестве статического свойства в MvcApplication (Global.asax.cs) и использовать его для создания экземпляра Mapper.
App_Start
Global.asax.cs
BaseController.cs
https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API
источник
Для тех, кто (потерян) использует:
Вот как мне удалось интегрировать AutoMapper «по- новому ». Также огромное спасибо за этот ответ (и вопрос)
1 - Создана папка в проекте WebAPI под названием «ProfileMappers». В эту папку я помещаю все классы своих профилей, которые создают мои отображения:
2 - В моем App_Start у меня есть SimpleInjectorApiInitializer, который настраивает мой контейнер SimpleInjector:
3 - Startup.cs
4 - Затем в вашем контроллере просто введите, как обычно, интерфейс IMapper:
источник
Для программистов vb.net, использующих новую версию (5.x) AutoMapper.
Global.asax.vb:
AutoMapperConfiguration:
Профили:
Отображение:
источник
Protected Overrides Sub Configure()
не рекомендуется. Все , остается такой же , но эта линия должна быть:Public Sub New()