[英]MVC 4 Controller and Web Api controller
我目前正在從事MVC 4項目,我需要為移動應用程序提供數據庫訪問權限,因此我選擇在Web Api中實現我的Web服務以獲得Json結果。 問題是我有很多代碼冗余! MVC控制器和Web Api控制器中存在相同的代碼。
例如,get程序:
1- Web api控制器:
public User GetUser(int id)
{
User user = db.Users.Find(id);
if (user == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return user;
}
2-MVC控制器
public ActionResult Details(int id = 0)
{
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return View(user);
}
一個返回JSon中的User實體,另一個返回一個視圖! 那么如何在另一個控制器中使用一個控制器來消除冗余呢?
從關注點分離的角度來看這個問題,兩個控制器都有不同的功能(分別提供JSON和標記),但是兩個控制器都需要使用通用服務:即數據持久性。
因此,正如@paul在評論中所建議的那樣,存儲庫模式提供了解決此問題的良好設計。 在您的示例中,您似乎並沒有收獲太多,但是一旦您的數據檢索和持久性邏輯變得更加復雜,存儲庫就會強制執行一致性,減少冗余並支持諸如依賴注入之類的更復雜的模式。
這是一個簡單的存儲庫:
interface IRepository
{
User GetUser(int id);
}
public class MyRepository: IRepository
{
public User GetUser(int id)
{
return db.Users.Find(id);
}
}
api控制器
public User GetUser(int id)
{
var repo = new MyRepository();
User user = repo.GetUser(id);
if (user == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return user;
}
MVC控制器:
public ActionResult Details(int id = 0)
{
var repo = new MyRepository();
User user = repo.GetUser(id);
if (user == null)
{
return HttpNotFound();
}
return View(user);
}
正如保羅所說,這完全是關注點分離。 Paul為您提供了一個帶有“邏輯服務層”的示例,該邏輯層是您解決方案中的一個獨立類庫,您的其他Web應用程序或桌面應用程序等都引用了該庫。 另一個示例可能是“物理服務層”,它是解決方案中的另一個Web Api項目,其中包含應用程序的所有服務方法。 在MVC項目中,只要您希望調用來吸引用戶,就可以創建一個新的WebClient來調用Web api的GetUser端點。
您只需從MVC控制器返回JSON()即可避免使用兩個框架。 這沒什么不對的,它將使您的生活變得簡單。
public ActionResult GetUser(int id) // GetUser is the action name, or you can just use Index
{
User user = db.Users.Find(id);
if (user == null)
{
return HttpNotFound();
}
return Json(user);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.