簡體   English   中英

BestPractice:如何以簡潔的方式在視圖中顯示多對多關聯?

[英]BestPractice: How to display a many-to-many association in a view in a clean way?

我正在使用NHibernate,並且在員工和團隊之間存在多對多關聯。

現在,我要顯示所有員工及其團隊成員的姓名。

可能性1:

  • 使用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實體(目前不在我的域模型中)

解決此問題的最佳做法是什么?

還有其他建議嗎?

這聽起來像是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)適用:-)

這取決於您是否要嚴格使用DTO將業務邏輯與表示邏輯(體系結構決策)分開。 在這種情況下,我希望使用解決方案1。

如果您對EmployeeTeam這樣的實體有行為,或者會有重用(例如在報告中),那么我更喜歡解決方案2。

使用要顯示為屬性的字段創建一個視圖dto。 使用自動映射器-將實體屬性映射到新的dto:

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

換句話說-您的視圖dto不必類似於域對象。

女://

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM