Отсутствует конфигурация карты типа или неподдерживаемое отображение после генерации автоматического кода на клиенте

77
6

У меня есть простой класс:

[DataContract]
public class ClaimView
{
[DataMember]
public string Type { get; set; }

[DataMember]
public string Value { get; set; }

[DataMember]
public string ValueType { get; set; }
}

Я получаю этот класс на стороне клиента ссылками на wcf-сервер и пытаюсь сопоставить его с System.Security.Claims.Claim:

    Mapper.CreateMap<ClaimView, Claim>()
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src=> src.Value))
.ForMember(dest => dest.ValueType, opt => opt.MapFrom(src => src.ValueType))
.ForMember(dest => dest.Issuer, opt => opt.Ignore())
.ForMember(dest => dest.OriginalIssuer, opt => opt.Ignore())
.ForMember(dest => dest.Properties, opt => opt.Ignore())
.ForMember(dest => dest.Subject, opt => opt.Ignore());

После того, как я получил ошибку от autommaper, он не сможет ее преобразовать. Что пропало или не так?

спросил(а) 2021-01-25T14:21:10+03:00 4 месяца, 3 недели назад
1
Решение
76

Поскольку Claim не имеет конструктора по умолчанию, вам нужно указать Automapper, какой конструктор использовать, например:

  Mapper.CreateMap<ClaimView, Claim>()

.ConstructUsing(cv => new Claim(cv.Type, cv.Value, cv.ValueType))

.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.Type))
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.Value))
.ForMember(dest => dest.ValueType, opt => opt.MapFrom(src => src.ValueType))
.ForMember(dest => dest.Issuer, opt => opt.Ignore())
.ForMember(dest => dest.OriginalIssuer, opt => opt.Ignore())
.ForMember(dest => dest.Properties, opt => opt.Ignore())
.ForMember(dest => dest.Subject, opt => opt.Ignore());

Затем этот тест пройдет:

public void Test()
{
ClaimIdentityView civ = new ClaimIdentityView
{
ClaimViewList = new List<ClaimView>
{
new ClaimView
{
Type = "type",
Value = "val",
ValueType = "string"
}
}
};

var claims = civ.ClaimViewList.Select(Mapper.Map<ClaimView, Claim>).ToList();

Assert.AreEqual(1, claims.Count);

Assert.AreEqual("type", claims.Single().Type);
Assert.AreEqual("val", claims.Single().Value);
Assert.AreEqual("string", claims.Single().ValueType);
}

ответил(а) 2021-01-25T14:21:10+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема