я не буду говорить на вопрос 2 как на самом деле его личное предпочтение, но для 1 я обычно использую один или несколько AutoMapper.Profile
для хранения всех моих Mapper.CreateMap
для определенной цели (domaintoviewmodel и т. Д.).
public class ViewModelToDomainAutomapperProfile : Profile
{
public override string ProfileName
{
get
{
return "ViewModelToDomain";
}
}
protected override void Configure()
{
CreateMap<TripRegistrationViewModel, TripRegistration>()
.ForMember(x=>x.PingAttempts, y => y.Ignore())
.ForMember(x=>x.PingResponses, y => y.Ignore());
}
}
затем я создаю загрузчик (IInitializer
), который настраивает Mapper, добавляя все мои профили.
public class AutoMapperInitializer : IInitializer
{
public void Execute()
{
Mapper.Initialize(x =>
{
x.AddProfile<DomainToViewModelAutomapperProfile>();
x.AddProfile<ViewModelToDomainAutomapperProfile>();
});
}
}
затем в моем global.asax я получаю все экземплярыIInitializer
и перебрать их, запустив Execute()
.
foreach (var initializer in ObjectFactory.GetAllInstances<IInitializer>())
{
initializer.Execute();
}
это моя общая стратегия.
по запросу, вот реализация отражения последнего шага.
var iInitializer = typeof(IInitializer);
List<IInitializer> initializers = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => iInitializer.IsAssignableFrom(p) && p.IsClass)
.Select(x => (IInitializer) Activator.CreateInstance(x)).ToList();
foreach (var initializer in initializers)
{
initializer.Execute();
}