我目前正在开发一个MVC 4项目,我需要将数据库的访问权限提供给移动应用程序,因此我选择在Web Api中实现我的Web服务以获得Json resulat。 问题是我有很多代码冗余! MVC控制器和Web Api控制器中存在相同的代码。
例如,获取程序:
1- web api controller:
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实体,另一个返回一个视图! 那么如何在另一个控制器中使用一个控制器来摆脱重新发生?
答案 0 :(得分:1)
从关注点分离的角度来看这个问题,两个控制器都有不同的功能(分别提供JSON和标记),但两者都需要使用公共服务:即数据持久性。 / p>
因此,正如@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);
}
答案 1 :(得分:1)
保罗说这完全是关于分离问题。 Paul为您提供了一个“逻辑服务层”的示例,该逻辑服务层是您的解决方案中的独立类库,您的其他Web应用程序或桌面应用程序等引用它。另一个示例可能是“物理服务层”,它是解决方案中的另一个Web Api项目,它包含应用程序的所有服务方法。从您的MVC项目中,只要您想要呼叫您的用户,您就可以创建一个新的WebClient来调用您的web api的GetUser端点。
答案 2 :(得分:1)
您可以从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);
}