0

我正在使用 NHibernate,并且员工和团队之间存在多对多关联。

现在我想显示所有员工及其团队成员的姓名。

可能性一:

  • 使用 AutoMapper 并创建一个包含 Employee 属性和团队名称的 DTO(渴望加载团队)
  • 在视图中显示 DTO

可能性2:

  • 创建一个名为 EmployeeTeam 的新实体并将其与 NHibernate/FluentNHibernate 映射(该实体充当数据库中 Employee 和 Team 之间的关系表)
  • 使用急切加载加载 TeamEmployee 包括 Employee 和 Team
  • 显示 EmployeeTeam 实体
  • 使用 EmployeeTeam 成员 (EmployeeTeam.Employee.Name, EmployeeTeam.Team.Name)

可能性3:

  • 作为可能性 1 和 2
  • 为 EmployeeTeam 使用 DTO

可能性4:

  • 使用 ICriteria API
  • 使用 AliasToBeanResultTransformer (没有使用这个)

可能性5:

  • 使用 LINQ 到 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) -

  • 如果域模型非常复杂并且简化有助于提高可读性
  • 如果您需要在显示之前进行一些视图数据修改
  • 如果您需要在回发时更新值。

我会避免使用选项二,因为它只会为您的域增加不必要的复杂性(从我可以从提供的当前信息中推断出的):-)

更新

如果您希望仍然显示没有团队的员工,您可以在视图中设置...

<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 来清理您的 View。如果您发现由于内联代码引用的数量而导致您的视图开始变得不可读,那么这通常表明 ViewModel (DTO) 将适用:-)

于 2010-02-24T12:46:28.520 回答
0

这取决于您是否要严格使用 DTO 将业务逻辑与表示逻辑(架构决策)分开。在这种情况下,我更喜欢解决方案 1。

如果您对像 EmployeeTeam 这样的实体有行为,或者会有重用(例如在报告中),那么我更喜欢解决方案 2。

于 2010-02-24T12:33:02.340 回答
0

使用要显示为属性的字段创建视图 dto。使用 automapper - 将实体属性映射到您的新 dto:

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

换句话说 - 您的视图 dto 不必类似于您的域对象。

w://

于 2010-02-24T12:33:02.650 回答