Createmap의 인스턴스 버전과 WCF 서비스와 함께 맵을 사용하십니까?

StackOverflow https://stackoverflow.com/questions/1668962

  •  13-09-2019
  •  | 
  •  

문제

Automapper와 관련하여 실제 문제가 있습니다. 솔루션을 찾았지만 구현 방법은 확실하지 않습니다.

기본적으로 저는 ResolveSusing과 함께 사용자 정의 매핑을 사용하고 있으며, 구조물을 생성자에게 전달하기 위해 구조적으로 구성되어 있으며, 대부분의 사람들이 이것을 Global.asax에서 한 번 설정하고 잊어 버린다는 것을 이해합니다.

그러나 문제는 내 방법 (WCF에서)이 다른 매개 변수로 통과한다는 것입니다.

정적 메소드 인 Mapper.createmap 및 Mapper.map을 사용하기 전에 메소드 (Multi -USER)를 통해 다른 청원이 WCF 서비스에 들어 오면 서로 충돌하는 것으로 보입니다.

내용을 읽은 후에는 Createmap 및 Map의 인스턴스 버전을 사용할 수 있으므로 각 개별 청원이 자체지도를 가져 와서 자체 매개 변수로 전달할 수 있습니다.

그러나 나는 그것을하는 방법을 찾을 수없는 것 같습니다. 누구든지 제발 설명 할 수 있습니까? 나는 정말로 붙어있다 ...

지금까지 나는 중복 키 오류를 받고 생성자에 로그 트레이스를 넣고 1 청원이 다른 하나를 덮어 쓰고있는 것으로 보입니다. 따라서 정적 버전의 맵퍼입니다.

글쎄, 나는 내가 맞기를 바랍니다. 그러나 나는 다른 것을 찾을 수 없습니다 ...

편집 - 내가 가진 것의 예

기본적으로 모든 매핑은 대부분의 경우 MAPFR을 사용하고 있기 때문에해야 할대로 작동합니다.

그런 다음 URL로 통과하는 Resolver 인스턴스를 만듭니다. 통과하기 전에 URL을 확인했습니다. 그러나 일단 반환되면 잘못된 URL을 반환합니다.

URL을 통과 해야하는 이유는 변수가 있으므로 변수를 교체해야하기 때문입니다. 기본적으로 사무실에 따라 2 개의 URL이 있으며 모든 곳에 통나무가 있고 내가 전달하는 내용을 볼 수 있지만 한 번은 한 번 볼 수 있습니다. 나는 그것을 통과시킨다 - 그것은 내가 통과 한 것이 아니다. 만약 그것이 말이된다면, 이것은 이상하다 !!

WCF 서비스와 클라이언트는이 방법을 2 개의 다른 사무실에서 두 번 통과하여 2 개의 다른 URL을 전달했습니다. 그러나 그들은 항상 같은 URL을 반환합니다. 한 세션이 다른 세션을 덮어 쓰고있는 것 같습니다 ...

나는 이것이 의미가 있기를 바랍니다.

  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))
            ;

어디에서 실패했는지 알았지 만 그 이유를 알 수 없습니다

코드와 함께 내 의견을 인라인으로보십시오. 생성자에서 urltemplate가 도착하면 개인 var에 저장 한 다음 재정의 resolvecore에서는 다른 것입니다 :-)

log4net 로그를 거기에 배치 했으므로 무슨 일이 일어나고 있는지 알 수 있습니다.

[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

임시 솔루션

나는 임시 솔루션을 수행했지만 정말 나쁘다. 나는 Automapper가 내가 시도하고있는 일을 할 수 있다고 확신하지만 분명히 뭔가 잘못하고 있습니다.

기본적으로 나는 LINQ를 통해 레코드 모음 (내 소스)을 통해 돌아와서 올바른 URL 템플릿이있는 모든 레코드에 새 필드를 입력했습니다. 그런 다음 (생성자를 통해) URL 템플릿을 통과하는 대신 컬렉션 (소스)의 모든 레코드에서 속성으로 사용할 수 있으며 완벽하게 작동합니다.

물론, 이것은 실제로 패치이며 이상적이지는 않지만 나를 달리게합니다.

내가 어디로 잘못 가고 있습니까?

도움이 되었습니까?

해결책 3

글쎄, 그것은 내 질문이 버려진 것 같습니다. 그러나 꽤 오래 놀고 나서 나는 마침내 좋은 수정을 찾았습니다 ..

기본적으로 나는 결의 안에 있었고 다른지도 중 하나가 다른 결의를 불렀던 또 다른지도를 가지고있었습니다.

이것에 문제가있는 것 같습니다. 또 다른 이상한 점은 응용 프로그램 풀이 시작되거나 재활용 될 때마다 실패했다는 것입니다. 따라서 처음에는 실패한 다음 재활용이 발생할 때까지 괜찮 았습니다 (WCF 앱을 사용하고 있습니다).

그래서 나는 두 번째 매핑을 foreach로 교체하고 원래 결의안 안에서 그런 매핑을했습니다 ...

미래에 다른 사람을 도울 수있는 경우에 답을 넣었습니다 ..

나는 매핑을하기 위해 Mapper 정적 방법을 사용하고 있었는데, 이것은 특정 요인에 따라 다른 것들을 전달해야하기 때문에 Global.asax에 있지 않았습니다.

나는 항상 Mappper의 인스턴스 버전으로 할 수 있는지 궁금했지만, 나는 그것이 존재했지만 ...하지만 결코 찾지 못했습니다.

하지만 어쨌든 모든 것이 100% 작동하고 있습니다 ...

다른 팁

예, 인스턴스 버전의 automapper를 사용하는 방법이 있습니다.

대신에...

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

당신이 사용할 수있는:

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

응답으로 루크 우드워드'에스 논평 최신 구문에서 :

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>();

대상 객체를 취하는지도 호출을 사용하는 것을 보셨습니까?

var bar = new Bar ( "각 호출 사용자 정의");

mapper.map (foo, bar);

Automapper에서 Mapper의 Instanced 버전을 사용하려면 MappingEngine 클래스를 사용할 수 있다고 생각합니다. 정적 맵퍼 클래스는 모든 니티 gritty 매핑 작업을 수행하기 위해 매핑 엔진 객체를 인스턴스화하고 구성한다고 생각합니다.

다음은 IOC를 Automapper에 적용하는 예입니다 (매핑 엔진의 인스턴스화가 필요함).

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top