0

場合によっては、リポジトリから複合DTOを返す必要があります。この場合、DTOにはモデルプロパティであるいくつかのプロパティがあり、DTOの機能は単純な複合オブジェクトであるだけです(Queryableを返すだけでは不十分です。 Tよりも多くの情報です)

例えば:

モデル:

public class Job
{
    int Id { get; set; }
    //more properties
}

public class JobApplication
{
    int Id { get; set; }
    //more properties
}

リポジトリ IQueryable<JobAndUserApplication> GetJobAndMatchingUserApplication(int userId)::

public class JobAndUserApplication
{
    public Job Job { get; set; }
    public JobApplication JobApplication { get; set; }
}

今-単純に実行したい(ProjectとToはAutomapper機能です):

//this allows one efficient query to bring in the subproperties of the composite DTO    
var jobVmList = jobRepository.GetAllJobsAndMatchingJobApplicationByUser(userId)              
                             .Project()
                             .To<JobVM>()
                             .ToList();

したがって、次のようなマッピングが必要です。

Mapper.CreateMap<JobAndUserApplication, JobVM>()
      .ForMember(jvm => jvm, opt => opt.ResolveUsing(src => src.Job));
      //many other .ForMembers that are not relevant right now

DTOのJobプロパティをJobVM(同じプロパティの多くを共有する)に直接マップしようとしています。

私のマッピングは次の例外をスローします:

メンバーのカスタム構成は、タイプの最上位の個々のメンバーに対してのみサポートされます。

何が間違っているのでしょうか。また、JobVM自体のDTOのJobプロパティからマッピングを実行するにはどうすればよいですか。

ありがとう

4

1 に答える 1

1

Automapperは、クラス自体ではなく、クラスのメンバー(プロパティ)に対してのみカスタムアクションを定義できることを通知しています。あなたがする必要があるのは、最初にJobtoJobVMマップを作成することです。

Mapper.CreateMap<Job, JobVM>()

Mapper.CreateMap<JobAndUserApplication, JobVM>()

必ず無視して、2つのタイプ間で重複するプロパティを設定してください。次に、automapperを2回実行します。最初は、子オブジェクトから実行します。

var jobVM = Mapper.Map<Job, JobVM>(jobAndUserApplication.job);

次に、親オブジェクトから

Mapper.Map<JobAndUserApplication, JobVM>(jobAndUserApplication, jobVM );

またはその逆で、プロパティのレイアウトに応じて異なります。

簡単な補足:懸念事項が混在している可能性があると感じており、コードの臭いアラームが鳴っています。これは私が思いついた典型的な問題ではないので、私はあなたのビューモデルかドメインモデルのどちらかをもう一度見てみます。(ちょうど私の$ 0.02 :-)

于 2012-04-30T20:42:03.570 に答える