Pergunta

tido alguns problemas reais com AutoMapper. Penso ter encontrado a solução, mas não tem certeza de como implementá-lo.

basicamente eu estou usando um mapeamento personalizado com ResolveUsing e ConstructedBy passar em parâmetros para o construtor, eu entendo que a maioria das pessoas definir isso no global.asax uma vez e esquecê-la.

Mas o problema é que o meu método (em um WCF) passa em diferentes parâmetros para o construtor de um ResolveUsing ......

Antes eu estava usando o Mapper.CreateMap e Mapper.Map que são métodos estáticos e parece que quando diferentes petições entrar no serviço WCF através de métodos (multi -user) eles estão em conflito uns com os outros.

Depois de ler algo que parece que eu posso usar a versão instância de CreateMap e Mapa de modo que cada petição individual recebe o seu próprio mapa e pode passar em seus próprios parâmetros.

Mas eu não consigo encontrar como fazê-lo. Alguém pode explicar por favor? Estou realmente preso ...

Antes de vez em quando eu recebo erros de chaves duplicadas e também eu coloquei em um rastreamento de log no construtor e parece que uma petição é substituir o outro -., Portanto, as versões estáticas de Mapper

Bem, eu espero que eu estou correto, mas não consigo encontrar qualquer outra coisa ...

EDITADO - um exemplo do que eu tenho

Basicamente tudo o mapeamento está funcionando como deveria, como eu estou usando MapFrom na maioria dos casos.

Então eu criar uma instância de minha Resolver que eu passar em uma URL. Fui verificar a url antes de passá-lo e sua correta. Mas uma vez que ele retorna ele retorna o URL errado.

A razão que eu preciso passar na URL é que ele tem variáveis ??em lá assim que eu preciso para substituir as variáveis ??... Basicamente, existem 2 urls, dependendo do escritório e eu tenho registros em todos os lugares e eu posso ver o que eu estou passando em mas uma vez eu passá-lo - não é o que eu passada, se isso faz sentido, isso é estranho !!

O seu serviço um WCF e um cliente chamou o método duas vezes passando em 2 escritórios diferentes, portanto, 2 URLs diferentes. Mas eles sempre retornar a mesma URL. É como uma sessão está substituindo o outro ...

Espero que este sentimento marcas.

  SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode);


        Mapper.CreateMap<Models.Custom.House, DTO.House>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.TaxIncluded,
                       opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxIncluded))
            .ForMember(dest => dest.TaxPercentage,
                       opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxPercentage))

            .ForMember(dest => dest.SalesPoints,
                       opt =>
                       opt.ResolveUsing(newSalesPointResolver))
            ;

OUT encontrado onde está a falhar - Mas o desconhecido PORQUE

Veja meus comentários na linha com o código. No construtor do urlTemplate chega, eu salvá-lo em um var privado e, em seguida, na ResolveCore substituído é outra coisa: -)

Eu tenho colocado alguns logs log4net lá, para que eu possa ver o que está acontecendo.

[Log]
public class SalesPointResolver : ValueResolver<Models.Custom.House, IList<DTO.SalesPoint>>
{
    private readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    private string urlTemplate;

    public SalesPointResolver (bool returnReservationUrl, string urlTemplate, DateTime startDate, DateTime endDate, string officeCode)
    {
        this.urlTemplate = urlTemplate;

        log.Error("passed in " + urlTemplate); // THIS IS PERFECT
        log.Error("I am now " + this.urlTemplate); // THIS IS PERFECT
    }

    protected override IList<DTO.SalesPoint> ResolveCore(House source)
    {
        this.house = source;

        log.Error("in  resolveCore :" + this.urlTemplate); // THIS IS RETURNING THE WRONG VALUE

solução temporária

Eu fiz uma solução temporária, mas é realmente ruim. Estou certo de que AutoMapper pode fazer o que estou tentando, mas estou obviamente fazendo algo errado.

Basicamente eu voltar via LINQ uma coleção de registros (ESTA É MINHA FONTE) para que eu entrou em um novo campo em todos os registros que tem o modelo de URL correta lá. E então, em vez de passar na (via construtor) o modelo de URL, eu tê-lo disponível como uma propriedade no registro CADA na coleção (a origem) ... e ele funciona perfeito.

Claro, isso realmente é remendo e não ideal, mas ele fica me em execução.

Para onde estou indo errado?

Foi útil?

Solução 3

Bem, parece que a minha pergunta é abandonado, mas depois de um bom tempo brincando eu finalmente encontrei um bom conserto ..

Basicamente, eu estava dentro de um Resolve e eu tinha um outro mapa que uma das propriedades chamou outro ResolveUsing ...

Parece que parece haver um problema com este. Outra coisa estranha é que ele falhou toda piscina o aplicativo foi iniciado ou reciclado .. Por isso, não pela primeira vez e, em seguida, foi ok até a reciclagem aconteceu (eu estou usando um aplicativo WCF).

Então, eu substituiu o segundo Mapping com com um foreach e fiz o meu mapeamento como esse dentro do meu Resolve originais ...

Eu coloquei a resposta aqui, caso ele pode ajudar qualquer outra pessoa no futuro ..

Eu estava usando os métodos estáticos Mapper para fazer meus mapeamentos, estes não estavam em global.asax como eu preciso passar coisas diferentes dependendo de alguns fatores ..

Eu sempre me perguntei se seria possível fazê-lo com versões instância de mappper, i embora existia ..... mas nunca descobri ..

Mas de qualquer maneira tudo está funcionando 100% agora ...

Outras dicas

Sim, há uma maneira de usar uma versão instância de AutoMapper.

Em vez de ...

Mapper.CreateMap<Dto.Ticket, Entities.Ticket>()

Você pode usar:

var configurationStore =
    new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
var mapper = new MappingEngine(configurationStore);
configurationStore.CreateMap<Dto.Ticket, Entities.Ticket>()

Em resposta a Luke Woodward 's comentário na nova sintaxe:

ConfigurationStore store 
   = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
store.AssertConfigurationIsValid();
MappingEngine engine = new MappingEngine(store);

//add mappings via Profiles or CreateMap
store.AddProfile<MyAutoMapperProfile>();
store.CreateMap<Dto.Ticket, Entities.Ticket>();

Você já olhou usando a chamada de Map que leva no objeto de destino?

var bar = barra nova ( "Custom cada chamada");

Mapper.Map (foo, bar);

Se você quiser usar uma versão instanced do Mapper em AutoMapper, então eu acho que você pode usar a classe MappingEngine. Eu acredito que os estáticos Mapper instancia da classe e configura um objeto MappingEngine para fazer todo o trabalho de mapeamento âmago da questão.

Aqui está um exemplo de aplicação COI AutoMapper (que requer instanciação do MappingEngine)

http: // www. lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top