4

オブジェクトには、BrokenRulesCollectionプロパティを持つCslaを使用しています。それをStatusMessagesプロパティを持つ自分のDTOに変換したいと思います。

独自のリゾルバーを作成しました:

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を使用して提供されたソース値を値リゾルバーにリダイレクトします。

助言がありますか?

編集:

フォローアップとして、変換を作成しようとしましたが、それでも同じメッセージが表示されます。

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

1 に答える 1

7

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に指示する必要がありますが、この場合は推測できません。

于 2010-02-25T04:50:02.573 に答える