2

特定のviewModelsをビューに渡すためにこれを行うための推奨事項を見た後、ドメインモデルをASP.NETMVCのビューモデルにマッピングするという概念を始めています。

1つのドメインモデルからより少ないプロパティを持つより単純なビューモデルへの基本的なマッピングを管理することができましたが、より複雑なビューモデルを作成する必要があり、それを理解できません。私は次のドメインモデルを持っています

public class Club
{
    public int ClubID { get; set; }
    public string FullName { get; set; }
    public string Description { get; set; }
    public string Telephone { get; set; }
    public string URL { get; set; }
    public DateTime CreatedDate { get; set; }

    public virtual ICollection<Member> Members{ get; set; }
}

public class Member
{
    public int MemberID{ get; set; }
    public string Name { get; set; }
    public MemberType Membership{ get; set; }
    public virtual Club Club { get; set; }
    public virtual int ClubID { get; set; }
}

public enum MemberType
{
    Standard,
    Special,
    Limited
}

このようなビューモデルにマップしたい(注:意味があると思うので、このように分割しましたが、よくわかりません)...

public class ClubDetailsViewModel
{
    public int ClubID { get; set; }
    public string FullName { get; set; }
    public string Description { get; set; }
    public IList<ClubDetailsMemberSummaryViewModel> Members { get; set; }
}

public class ClubDetailsMemberSummaryViewModel
{
    public MemberType Membership { get; set; }
    public int MemberCount { get; set; }
}

私が最終的にしようとしているのは、クラブの詳細の一部と、会員数を含むクラブの会員タイプの要約レポートを表示するページです。そのような:

Some Club Name
Description of the club.....

CLUB MEMBERS
Limited - 15
Standard - 100

したがって、ビューモデルはこれに適していると思います(ただし、これを行うにはより良い方法かもしれません)。私が苦労しているのは、要素をマッピングする方法です。クラブにメインフィールドをクラブビューモデルにマップさせることはできますが、クラブのリストの結果をビューモデルにマップし、それをメインビューモデルにリストとして追加する方法を実際に理解することはできません。

これを使用してリポジトリからクラブを取得しています

var clubs = _clubRepository.GetClubByID(ID);

次に、これを使用して、データアクセス層のインクルードを使用して返されるCourtsをエンティティフレームワークから変換できます

var grpCourts = from c in clubs.Members
                group c by c.Membership into grp 
                select new { st = grp.Key, count = grp.Distinct().Count() };

結果のレコードをループしてClubDetailsMemberSummaryViewModelにマップし、それらのリストをメインのClubDetailsViewModelに追加するにはどうすればよいですか?

4

2 に答える 2

1

ClubからへのマッピングはClubDetailsViewModel、 を除いて自明ですMembers。そのプロパティについては、インラインでクイック リゾルバーを作成するか、独自のカスタム リゾルバーを作成できます。インライン リゾルバーは次のようになります。

Mapper.CreateMap<Club, ClubDetailsViewModel>()
    .ForMember(dest => dest.Members, opt => opt.ResolveUsing(src => 
    {
        return src.Members
            .GroupBy(m => m.Membership)
            .Select(grp => new ClubDetailsMemberSummaryViewModel
            {
                Membership = grp.Key,
                MemberCount = grp.Distinct().Count()
            });
    }));

このようなより複雑なリゾルバーを独自のクラスにリファクタリングすることをお勧めします。

public class MembershipClubDetailsResolver : ValueResolver<Club, IList<ClubDetailsMemberSummaryViewModel>>
{
    protected override IList<ClubDetailsMemberSummaryViewModel> ResolveCore (Club source) 
    {
        return source.Members
            .GroupBy (m => m.Membership)
            .Select(grp => new ClubDetailsMemberSummaryViewModel
            {
                Membership = grp.Key,
                MemberCount = grp.Distinct().Count()
            })
            .ToList();
    }
}

そして、マッピングでそのリゾルバーを使用します。

Mapper.CreateMap<Club, ClubDetailsViewModel>()
    .ForMember(dest => dest.Members, opt => opt.ResolveUsing<MembershipClubDetailsResolver>());
于 2012-06-26T13:24:41.827 に答える
0

あなたのマッピングはかなり複雑に見えます。オートマッパーの .ConvertUsing メソッドを使用すると思います

Mapper.CreateMap<List<Club>,List<ClubDetailsViewModel>>()
.ConvertUsing<ClubToClubDetailsViewModel>();

変換クラスには次の継承があります

public class ClubToClubDetailsViewModel: TypeConverter<List<Club>,List<ClubDetailsViewModel>>
{
....
}

または、2 つの「単純な」マッピングを作成して調整することもできます

Mapper.CreateMap<Club,ClubDetailsViewModel>()

これにより、Members というプロパティを除くすべてがマップされます

次に、メンバーの ClubDetailsMemberSummaryViewModel へのマッピングを作成する必要があります。そのマッピングを手動で行うか、automapper でこれを構成することもできます。

オートマッパーの詳細については、https://github.com/AutoMapper/AutoMapper/wikiにアクセスしてください。

于 2012-06-26T12:34:24.363 に答える