2012-01-09 3 views
4

Есть ли все равно, чтобы сконденсировать это с помощью automapper? Это просто становится большим.Automapper и общее картографирование

 Mapper.CreateMap<PagedResult<Headline>, PagedResult<HeadlineModel>>(); 
     Mapper.CreateMap<PagedResult<Event>, PagedResult<EventModel>>(); 
     Mapper.CreateMap<PagedResult<GymCourt>, PagedResult<GymCourtModel>>(); 
     Mapper.CreateMap<PagedResult<Gym>, PagedResult<GymModel>>(); 
     Mapper.CreateMap<PagedResult<EventGymCourt>, PagedResult<EventGymCourtModel>>(); 
     Mapper.CreateMap<PagedResult<Division>, PagedResult<DivisionModel>>(); 
     Mapper.CreateMap<PagedResult<Team>, PagedResult<TeamModel>>(); 
     Mapper.CreateMap<PagedResult<DivisionTeam>, PagedResult<DivisionTeamModel>>(); 
     Mapper.CreateMap<PagedResult<MemberTeam>, PagedResult<MemberTeamModel>>(); 
     Mapper.CreateMap<PagedResult<TeamCoach>, PagedResult<TeamCoachModel>>(); 
     Mapper.CreateMap<PagedResult<DivisionAsset>, PagedResult<DivisionAssetModel>>(); 
     Mapper.CreateMap<PagedResult<EventAsset>, PagedResult<EventAssetModel>>(); 
     Mapper.CreateMap<PagedResult<Event>, PagedResult<ApiEvent>>(); 
     Mapper.CreateMap<PagedResult<Price>, PagedResult<PriceModel>>(); 
     Mapper.CreateMap<PagedResult<DivisionPrice>, PagedResult<DivisionPriceModel>>(); 
     Mapper.CreateMap<PagedResult<EventPrice>, PagedResult<EventPriceModel>>(); 
     Mapper.CreateMap<PagedResult<Division>, PagedResult<ApiDivision>>(); 
     Mapper.CreateMap<PagedResult<Data.Entities.Player>, PagedResult<PlayerModel>>(); 

ответ

0

Я боюсь, что нет. В какой-то момент вам нужно будет сказать AutoMapper о ваших сопоставлениях классов.

Если вы хотите консолидировать свой Global.aspx (при условии, что вы используете AutoMapper в Asp.Net), вы можете попробовать Bootstrapper.

Подробнее о загрузчике: http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx

+0

Я использую Ninject –

1

Насколько я знаю, нет сборки в поддержке в Automapper для конвенций регистрации пользовательского Mapper, но вы можете высушить его немного с некоторым отражением:

var mappingDictionary = new Dictionary<Type, Type> 
{ 
    {typeof (Headline), typeof (HeadlineModel)}, 
    {typeof (Event), typeof (EventModel)}, 
    //... 
}; 
foreach (var sourceType in mappingDictionary.Keys) 
{ 
    Mapper.CreateMap(
     typeof (PagedResult<>).MakeGenericType(sourceType), 
     typeof (PagedResult<>).MakeGenericType(mappingDictionary[sourceType])); 
} 

Или, если вы всегда следовать вашей конвенции Headline ->HeadlineModel и т.д. с более некоторого размышления вам не нужно, чтобы создать отображение вручную:

var modelAssembly = Assembly.GetAssembly(typeof(HeadlineModel)); 
var otherAssembly = Assembly.GetAssembly(typeof(Headline)); 
foreach (var destinationType in modelAssembly.GetTypes() 
    .Where(t => t.Namespace == "ModelNaspace" && t.Name.EndsWith("Model"))) 
{ 
    var destinationName = destinationType.Name.Replace("Model", ""); 
    var sourceType = otherAssembly.GetTypes() 
     .SingleOrDefault(t => t.Namespace == "OtherNamespace" && t.Name == destinationName); 

    if (sourceType == null) 
    { 
     //log warning 
     continue; 
    } 

    Mapper.CreateMap(
     typeof (PagedResult<>).MakeGenericType(sourceType), 
     typeof (PagedResult<>).MakeGenericType(destinationType)); 
} 
+0

Ill попробовать его. –

11

Что вы можете сделать, это использовать метод расширения. Если добавить этот класс:

public static class MappingExtensions 
{ 
    public static IMappingExpression<TSrc, TDest> IncludePagedResultMapping<TSrc, TDest>(this IMappingExpression<TSrc, TDest> expression) 
    { 
     Mapper.CreateMap<PagedResult<TSrc>, PagedResult<TDest>>() 
      .ForMember(dest => dest.HasMoreResults, opt => opt.MapFrom(src => src.HasMoreResults)) 
      .ForMember(dest => dest.NextPage, opt => opt.MapFrom(src => src.NextPage)); 

     return expression; 
    } 
} 

, то вы можете включить страничное отображение, как часть вашей сущности модели отображений, а именно:

Mapper.CreateMap<Headline, HeadlineModel>().IncludePagedResultMapping(); 
Mapper.CreateMap<Event, EventModel>().IncludePagedResultMapping(); 
Mapper.CreateMap<GymCourt, GymCourtModel>().IncludePagedResultMapping(); 
Mapper.CreateMap<Player, PlayerModel>().IncludePagedResultMapping(); 
+0

Очень хороший бит кода. – stevethethread