2012-01-15 4 views
0

私は特定のプロジェクトを編集するためのビューを持っています。ここで私はこのビューのビューモデルを製造するために何をすべきかです:マッピングが発生したときにカスタム関数を自動的に呼び出す(プロパティを満たすため)

  1. 新しいビューモデルオブジェクトはANPそれに私のプロジェクトをマップする準備プロジェクト情報
  2. を取得します。
  3. これを満たす関数を呼び出して、TechnologyStringを準備します。
  4. ビューを表示します。

    public ActionResult Edit(string slug) 
    { 
        // 1 
        Project project = m_ProjectBusiness.GetProject(slug); 
    
        // 2 
        ProjectEditViewModel viewModel = new ProjectEditViewModel 
        { 
         ProjectToEdit = Mapper.Map<Project, ProjectFullViewModel>(project)     
        }; 
    
        // 3 
        viewModel.ProjectToEdit.TechnologyString = m_ProjectBusiness.ListTechnologies(project); 
    
        // 4 
        return View(viewModel); 
    } 
    

あなたはポイント3のために見ることができるように、私は私のオブジェクトProjectToEditの下で、私の見解モデル内の文字列(TechnologyString)に記入。私はマッピングが発生したときにこの操作を直接(そして自動的に)行うことが可能かどうかを知りたいですか?

ありがとうございました。


EDIT

私はマッピングに基づいて解決策を見つけました。ここには:

 Mapper.CreateMap<Project, ProjectFullViewModel>() 
      .ForMember(dest => dest.TechnologyString, 
         opt => opt.MapFrom(src => String.Join(" ", src.Technologies.Select(x => x.Name)))); 

私は自分のプロジェクトに添付されているすべての技術を取得し、すべての項目をスペースで区切って文字列を作成します。

読者:テクノロジがドメインモデルに含まれていない場合、以下のDarinのソリューションが動作することに注意してください。しかし、この場合、それはです。

答えて

0

これは、マッピングレベルで処理する必要があるものではありません。

public class ProjectAggregateRoot 
{ 
    public Project Project { get; set; } 
    public string TechnologyString { get; set; } 
} 

し、この集約ルートを返します、あなたのサービス層での方法があります:あなたは、プロジェクトや技術の集約ルートを定義しますするサービス層を使用することができ

public ProjectAggregateRoot GetProjectBySlug(string slug) 
{ 
    var project = _repo.GetProject(slug); 
    var technoString = _repo.ListTechnologies(project); 
    return new ProjectAggregateRoot 
    { 
     Project = project, 
     TechnologyString = technoString 
    } 
} 

を作成してから、サービスレイヤーから返される集約ルートとビューモデルを直接マップすることができます。

public ActionResult Edit(string slug) 
{ 
    var model = _service.GetProjectBySlug(slug); 

    // now you have everything in the aggregate root to build your view model 
    var viewModel = Mapper.Map<ProjectAggregateRoot, ProjectEditViewModel>(model); 
    return View(viewModel); 
} 
+0

ありがとうございます。あなたのソリューションは動作しますが、その間にマッピングに基づいた別のソリューションが見つかったので、私はそれを示すために私の質問を編集しました。あなたは見てみることができますか? – Bronzato

+0

@Bronzato、ああ、既にドメインモデルに 'Technologies'プロパティがありますか?偉大な、あなたはそれを言及すべきでした。つまり、あなたのプロジェクトは実際には既に集約ルートになっています。この場合、あなたのソリューションはうまく動作します。あなたがこの 'm_ProjectBusiness.ListTechnologies(project);'をあなたの質問で呼んだので、私は混乱していました。あなたのプロジェクトモデルには情報がないと思っていました。実際には、プロジェクトには技術が含まれているため、この呼び出しは必要ではないため、スラグからプロジェクトを取得することで、必要なものはすべてすでに用意されています。マッピングに参加することは正しい方法です。 –

+0

私の質問は、それについて申し訳ありませんが完全にはっきりしていませんでした。あなたの解決策も有効なので、私はそれを受け入れたものとしてマークします。ありがとう。 – Bronzato

関連する問題