0

私は NHibernate を使用しており、従業員とチームの間に多対多の関連付けがあります。

ここで、すべての従業員をそのチーム メンバーの名前とともに表示したいと考えています。

可能性 1:

  • AutoMapper を使用して、従業員のプロパティとチームの名前を含む DTO を作成します (チームのイーガー ロード)
  • ビューに DTO を表示する

可能性 2:

  • EmployeeTeam という新しいエンティティを作成し、それを NHibernate/FluentNHibernate にマップします (このエンティティは、データベース内の従業員とチームの間のリレーショナル テーブルとして機能します)。
  • 熱心な読み込みを使用して TeamEmployee を読み込むには、Employee と Team を含めます
  • EmployeeTeam エンティティを表示する
  • EmployeeTeam メンバーを使用する (EmployeeTeam.Employee.Name、EmployeeTeam.Team.Name)

可能性 3:

  • 可能性1と2として
  • EmployeeTeam に DTO を使用する

可能性 4:

  • ICriteria API を使用する
  • AliasToBeanResultTransformer を使用します (これは使用しませんでした)

可能性 5:

  • LINQ to NHibernate を使用する
  • 私はまだ EmployeeTeam エンティティが必要だと思います (これは今のところ私のドメイン モデルにはありません)。

この問題のベスト プラクティスは何ですか?

他の提案はありますか?

4

3 に答える 3

2

これは UI の悪夢のように聞こえますが、従業員のリストをビューに渡すだけで済みます。次に、従業員をループするループ内でチームをループするネストされたループを作成します。Asp.Net MVC では次のようになります -

<table>
    <thead>
        <tr>
            <td>Employee</td>
            <td>Team</td>
        </tr>
    </thead>
    <% foreach(var employee in Model.Employees) { %>
        <% foreach (var team in employee.Teams) { %>
            <tr>
                <td><%=employee.Name %></td>
                <td><%=team.Name %></td>
            </tr>
        <% } %>
    <% } %>
</table>

次の状況では、ViewModel (DTO) を使用します。

  • ドメイン モデルが非常に複雑で、単純化すると読みやすくなる場合
  • 表示する前にビュー データを変更する必要がある場合
  • ポストバックで値を更新する必要がある場合。

ドメインに不必要な複雑さを追加するだけなので(提供された現在の情報から推測できることから)、オプション2は避けます:-)

アップデート

チームのない従業員を引き続き表示したい場合は、ビューでこれを設定できます...

<table>
    <thead>
        <tr>
            <td>Employee</td>
            <td>Team</td>
        </tr>
    </thead>
    <% foreach(var employee in Model.Employees) { %>
        <tr>
            <% if (employee.Teams.Any()) { %>
                <td><%=employee.Name %></td>
                <td> - </td>
            <% } else { %>
                <% foreach (var team in employee.Teams) { %>
                    <td><%=employee.Name %></td>
                    <td><%=team.Name %></td>
                <% } %>
            <% } %>
        </tr>
    <% } %>
</table>

明らかに、このような UI の微調整が多ければ多いほど、ViewModel を使用してビューをクリーンアップしたくなる可能性が高くなります。インライン コード参照の数が原因でビューが読み取り不能になり始めていることがわかった場合、これは通常、ViewModel (DTO) が適用可能であることを示しています:-)

于 2010-02-24T12:46:28.520 に答える
0

It depends if you want to use DTOs stictly to separate your business logic from your presentation logic (architectural decision). In a such scenario I would prefer solution 1.

If you have behaviour for an entity like EmployeeTeam or there will be a reuse (for example in a report), then I would prefer solution 2.

于 2010-02-24T12:33:02.340 に答える
0

create a view dto with the fields you want to display as properties. using automapper - map the entity properties to your new dto:

Mapper.CreateMap<Obj1, NewObjDto>()
                .ForMember(dest => dest.Prop1, opt => opt.MapFrom(src => src.Obj1.Prop1));

in other words - your view dto doesn't have to resemble your domain objects.

w://

于 2010-02-24T12:33:02.650 に答える