2012-06-11 3 views
3

다음 클래스와 해결자가 제공되는 이유는 무엇입니까? ProductAddModel이 전혀 전달되지 않는 이유가 없습니다.AutoMapper 해결자가 예상 유형을 전달하지 않습니다.

AutoMapper.AutoMapperMappingException 사용자 코드 공급
= 메시지 값은 입력 System.Decimal이다 의해 처리되지 않은했지만 AuctionCMS.Framework.Models.Admin.ProductAddModel 예상. 리졸버 소스 유형을 변경하거나 제공된 소스 값을 FromMember를 사용하여 값 리졸버로 리디렉션하십시오.

유형 :

public class Currency 
    { 
     public Int64 Value { get; set; } 
     // Spot saved for currency type and any other extra properties 
    } 

    public class Product 
    { 
     public Currency Price { get; set; } 
     public Currency ReservePrice { get; set; } 
      } 

    public class ProductAddModel 
    { 
     public Decimal Price { get; set; } 
     public Decimal ReservePrice { get; set; } 
    } 

확인자 코드 :

public class DecimalToCurrencyValueResolver : ValueResolver<decimal, Currency> 
{ 
    #region Overrides of ValueResolver<decimal,Currency> 

    protected override Currency ResolveCore(decimal source) 
    { 
     return new Currency() { Value = (Int64)((decimal)source) * 1000 }; 
    } 

    #endregion 
} 

public class CurrencyToDecimalValueResolver : ValueResolver<Currency, decimal> 
{ 
    #region Overrides of ValueResolver<decimal,Currency> 

    protected override decimal ResolveCore(Currency source) 
    { 
     return (decimal)source.Value * 1000; 
    } 

매핑 코드 : 내가 잘못하고 간단하게 처리 할 수있는 가장 좋은 방법이 접근 방식입니다 무엇

  Mapper.CreateMap<ProductAddModel, Product>() 
       .ForMember(x => x.Price, opt => opt.ResolveUsing<DecimalToCurrencyValueResolver>()) 
       .ForMember(x => x.ReservePrice, opt => opt.ResolveUsing<DecimalToCurrencyValueResolver>()); 
      Mapper.CreateMap<Product, ProductAddModel>() 
       .ForMember(x => x.Price, opt => opt.ResolveUsing<CurrencyToDecimalValueResolver>()) 
       .ForMember(x => x.ReservePrice, opt => opt.ResolveUsing<CurrencyToDecimalValueResolver>()); 

var model = new ProductAddModel(); 
var product = new Product(); 
Mapper.Map<ProductAddModel, Product>(model, product); 

매핑 프로세스 중에 변환합니까?

감사합니다.

답변

2

사용 TypeConverters 대신 :

여기
public class CurrencyToDecimalTypeConverter : ITypeConverter<Currency, Decimal> 
    { 
     public decimal Convert(ResolutionContext context) 
     { 
      return ((Currency)context.SourceValue).Value * 1000; 
     } 
    } 

    public class DecimalToCurrencyTypeConverter : ITypeConverter<Decimal, Currency> 
    { 
     public Currency Convert(ResolutionContext context) 
     { 
      return new Currency() { Value = (Int64)((decimal)context.SourceValue) * 1000 }; 
     } 
    } 

하는 구성입니다 : 리졸버 소수점에서

Mapper.CreateMap<ProductAddModel, Product>(); 
Mapper.CreateMap<Product, ProductAddModel>(); 
Mapper.CreateMap<Decimal, Currency>().ConvertUsing<DecimalToCurrencyTypeConverter>(); 
Mapper.CreateMap<Currency, Decimal>().ConvertUsing<CurrencyToDecimalTypeConverter>(); 

var model = new ProductAddModel(); 
var product = new Product(); 
Mapper.Map<ProductAddModel, Product>(model, product); 
+0

나는 거의 같은 결론에 도달했습니다. 감사! – rboarman

+0

완벽! 정확히 내 문제를 해결하는 데 필요한 힌트. –

0

사용 및 매핑에 productAddModel이 전달됩니다. 따라서 매핑은 이와 같아야합니다.

Mapper.CreateMap<ProductAddModel, Product>() 
       .ForMember(x => x.Price, opt => opt.ResolveUsing<DecimalToCurrencyValueResolver>().FromMember(e => e.Value)); 
관련 문제