2016-10-02 2 views
0

Я хочу использовать automapper для создания абсолютного URL-адреса с использованием профиля Automappers. Что лучше всего делать?Как разрешить абсолютный URL-адрес с automapper

  • Мои профили автоконфигурируются во время запуска.
  • Я использую контейнер Ioc, если это может помочь.

    SourceToDestinationProfile : Profile 
    { 
        public SourceToDestinationProfile() 
        { 
         var map = CreateMap<Source, Destination>(); 
    
         map.ForMember(dst => dst.MyAbsoluteUrl, opt => opt.MapFrom(src => "http://www.thisiswhatiwant.com/" + src.MyRelativeUrl)); 
         ... 
        } 
    } 
    

В некотором роде я динамически хочу забрать запрос базового URL («http://www.thisiswhatiwant.com/»), чтобы сделать возможным, чтобы положить его вместе с моим RelativeURL. Я знаю один способ сделать это, но это не очень, т. Е. Не может быть лучшим способом.

+1

Я думаю, что это анти-модель, потому что картографы должны быть немым, и, таким образом, вы можете противостоять искушению вводя слишком много логики в них. –

+0

Да, вы правы в этом смысле, они должны быть совершенно глупыми. Карту от одной вещи к другой. Дело в том, что я хочу выставить полные ссылки на другие ресурсы в моем api, и поэтому мне нужен этот базовый url. Одним из решений было бы «расширить» мой исходный объект (то есть SourceWithContext) и включить базовый url в качестве контекста при сопоставлении. Это означает, что отображение будет осуществляться только от источника до адресата. Конкатенацию нужно делать где-то ... – Per

ответ

1

Я не знаю, является ли то, что вы ищете:

public class Source 
{ 
    public string Value1 { get; set; } 

    public string Value2 { get; set; } 
} 

public class Destination 
{ 
    public string Value1 { get; set; } 

    public string Value2 { get; set; } 
} 

public class ObjectResolver : IMemberValueResolver<Source, Destination, string, string> 
{ 
    public string Resolve(Source s, Destination d, string source, string dest, ResolutionContext context) 
    { 
     return (string)context.Items["domainUrl"] + source; 
    } 
} 

public class Program 
{ 
    public void Main() 
    { 
     var config = new MapperConfiguration(cfg => 
      { 
       cfg.CreateMap<Source, Destination>() 
        .ForMember(o => o.Value1, opt => opt.ResolveUsing<ObjectResolver, string>(m=>m.Value1)); 
      }); 

      var mapper = config.CreateMapper(); 
      Source sr = new Source(); 
      sr.Value1 = "SourceValue1"; 
      Destination de = new Destination(); 
      de.Value1 = "dstvalue1"; 
      mapper.Map(sr, de, opt => opt.Items["domainUrl"] = "http://test.com/");  
    } 
}