2016-10-12 124 views
1

這是一個假設性的問題,可以說,我有一個非常基本的論壇MVC實體分離的最佳實踐

我有以下的實體(對象)

public class User 
{ 
    public Guid Id { get; set;} 
    public string Username { get; set;} 
} 

public class Thread 
{ 
    public Guid Id { get; set;} 
    public Guid Owner { get; set;}//UserId 
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
} 

public class Post 
{ 
    public Guid Id { get; set; } 
    public Guid ThreadId { get; set; } 
    public string Content { get; set; } 
    public DateTime DatePosted { get; set; } 
    public Guid PostedBy { get; set; }//UserId 
} 

我有以下控制器

  1. UsersController
  2. ThreadsController
  3. PostsController

當我想要檢索特定的線程或線程列表時,我打了ThreadsController。

,當我想找回帖子特定線程,我打的PostsController

問題:

如果我想要檢索線程的列表,用戶已經創建,它的以下將是最好的辦法:

  1. 創建一個新的控制器 - UserThreadsController,返回線程對象的列表

  2. 創建的ThreadsController額外的操作方法,即GetByUser

  3. 創建的UserController中的額外的操作方法,即GetThreads

感謝

+0

你可以發佈你的模型? 'Threads'是否有一個連接到'User'表的'ID'字段的外鍵屬性? –

+0

問題不在於我如何去檢索數據,這是我完全適應的。問題是我如何構建我的控制器? – pieperu

回答

2

這有可能會被封閉,自以爲是,因爲它是。我個人的意見是,你已經有太多分離了。

實體和控制器之間不需要有1-1關聯。事實上,讓控制器更高級別比封裝概念更好,而不僅僅是一件事情。例如,您可能只需要一個ForumController,並列出所有線程的操作,並顯示一個線程。至少在我遇到的每個論壇中,個人帖子都不會單獨顯示,所以您甚至不需要針對這些帖子採取措施。

顯示特定於用戶的線程是有點投入的。在UserController上有這樣的東西是有道理的,但是在ForumController中擁有與論壇相關的所有內容也是有意義的。我認爲你可以合理地走任何一條路。

+0

感謝您的輸入Chris。非常感激。它與我收到的一些其他建議(或者說另一個意見)相矛盾,那就是擁有很多控制器的行爲很少,而不是很少採取行動的控制器。如果它是REST服務而不是ASP.Net MVC應用程序,你會給出相同的意見嗎?再次感謝 – pieperu

+1

這取決於。在MVC中,這種模式有句俗話:「瘦控制器,胖模式」。然而,在MVC框架中,並沒有真正的模型,控制器往往需要做的比在一個更嚴格遵守MVC模式的框架中更加繁重。我不一定主張擁有數千行代碼的控制器,但我們並不是在這裏談論這一點。即使是一個完整的基礎論壇也可能只包含6-8個行動,並且你可以將這些行爲的大部分真實代碼分解爲實用程序類。 –

+0

有趣。這是有道理的,因爲我的控制器大部分操作都是一個單線程包裹在一個try catch(一個班輪去服務處理繁重的工作)。我承諾的最後一個問題 - 所以要遵​​循典型的REST約定(GET/POST/PUT/DELETE),你會說相反的事實嗎?我知道WebApi和Asp.Net MVC在體系結構(MVC)方面很相似,但是現在這是一個慣例。再次感謝您的輸入 – pieperu