Отображение списка одного типа другому - PullRequest
4 голосов
/ 24 февраля 2010

Для своих объектов я использую Csla, которая имеет свойство BrokenRulesCollection. Я хотел бы преобразовать это в мой собственный DTO, у которого есть свойство StatusMessages.

Я создал свой собственный преобразователь:

public class BrokenRulesCollectionResolver : ValueResolver<Csla.Validation.BrokenRulesCollection, StatusMessageList>
{
    protected override StatusMessageList ResolveCore(Csla.Validation.BrokenRulesCollection source)
    {
        var messageList = new StatusMessageList();
        messageList.ReadBrokenRules(source);
        return messageList;
    }
}

И в сопоставлении я сообщаю ему, какой преобразователь использовать:

        Mapper.CreateMap<DomainObjects.Members.IMemberRegistration, DTO.Members.MemberRegistrationForm>()
            .ForMember(src => src.StatusMessages, opt => opt.ResolveUsing <BrokenRulesCollectionResolver>());

Однако, когда я пытаюсь сделать отображение:

       return Mapper.Map<DomainObjects.Members.IMemberRegistration, DTO.Members.MemberRegistrationForm>(memberRegistration);

Я получаю следующую ошибку:

Предоставлено значение типа Csla.Validation.BrokenRulesCollection, но ожидается Favs.DomainObjects.Members.MemberRegistration. Измените тип источника преобразователя значений или перенаправьте исходное значение, предоставленное в преобразователь значений, с помощью FromMember.

Есть предложения?

Edit:

В качестве продолжения я также попытался создать конвертирование, но все равно получил то же сообщение:

public class BrokenRulesCollectionConverter : ITypeConverter<Csla.Validation.BrokenRulesCollection, StatusMessageList>
{
    public StatusMessageList Convert(ResolutionContext context)
    {
        var test = new StatusMessageList();
        test.ReadBrokenRules((Csla.Validation.BrokenRulesCollection)context.SourceValue);
        return test;
    }
}

И настройте его следующим образом:

        Mapper.CreateMap<Csla.Validation.BrokenRulesCollection, StatusMessageList>()
            .ConvertUsing<BrokenRulesCollectionConverter>();

1 Ответ

7 голосов
/ 25 февраля 2010

Экземпляр, который AutoMapper передает в ResolveCore, здесь не является BrokenRulesCollection - AutoMapper не знает, из какого свойства IMemberRegistration получить это. Когда вы используете пользовательский распознаватель, он получает экземпляр того же объекта, который вы пытаетесь отобразить.

Это должно работать, если вы переписываете свой первый класс следующим образом:

public class BrokenRulesCollectionResolver :
    ValueResolver<DomainObjects.Members.IMemberRegistration, StatusMessageList>
{
    protected override StatusMessageList ResolveCore(
        DomainObjects.Members.IMemberRegistration source)
    {
        var messageList = new StatusMessageList();
        messageList.ReadBrokenRules(source.BrokenRules);
        return messageList;
    }
}

Примечание. Я предполагаю, что элемент, который вы хотите отобразить на IMemberRegistration, является свойством с именем BrokenRules. Измените это на любое другое.

Изменить - вы также можете делать то, что предлагает сообщение и использовать FromMember:

Mapper.CreateMap<DomainObjects.Members.IMemberRegistration,
    DTO.Members.MemberRegistrationForm>()
        .ForMember(src => src.StatusMessages,
            opt => opt
                .ResolveUsing<BrokenRulesCollectionResolver>()
                .FromMember(r => r.BrokenRules));

Опять же, это предполагает, что свойство называется BrokenRules. Вы должны сказать AutoMapper, он не может угадать в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...