4

次のクラスとリゾルバーを考えると、なぜこのエラーが発生するのですか?ProductAddModelが渡される理由がまったくわかりません。

AutoMapper.AutoMapperMappingExceptionはユーザーコードによって処理されませんでした
Message=提供された値はタイプ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);

私は何を間違っていますか?このアプローチは、マッピングプロセス中に単純な変換を処理するための最良の方法ですか?

ありがとう!

4

2 に答える 2

3

代わりに 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);
于 2012-06-12T08:41:08.913 に答える
0

リゾルバーでは decimal が使用され、マッピングでは productAddModel が渡されます。したがって、マッピングは次のようになります

Mapper.CreateMap<ProductAddModel, Product>()
                .ForMember(x => x.Price, opt => opt.ResolveUsing<DecimalToCurrencyValueResolver>().FromMember(e => e.Value ));
于 2014-05-11T18:33:17.860 に答える