簡體   English   中英

MVC 4控制器和Web Api控制器

[英]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.

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