MVC如何保持一个模型骨感[关闭](MVC How to keep a model skinny [

2019-08-16 17:00发布

看此之后的视频 ,如果我用我的错控制器,我想知道。 究竟应该怎样控制器包含哪些内容?

对于我的博客,我有一个post控制器,具有方法:创建节目列表loadPost喜欢不喜欢

而我的职务模型只有少数访问规则,验证规则和相关信息。 有没有在网络上MVC应用程序的任何例子吗?

Answer 1:

我强烈建议你阅读http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/04/24/how-we-do-mvc.aspx

这里是我的什么控制器不应该做的不完全名单:

  • 绑定后的数据,查看模型 - 不,模型粘合剂应该这样做
  • 得到库的实体 - 我说没有,模型粘合剂或行动过滤器应
  • 计算的东西 - 不,视图模型或实体应
  • 授权 - 也许,但它是更好的传球属性/过滤器
  • 验证 - 只有当它从实体回来/域(即业务规则),视图模型(演示文稿)验证应该被自动处理(粘合剂等)

应该做:

  • 获取绑定,验证视图模型作为输入
  • 调用域层,从视图模型传递数据
  • 处理领域层错误
  • 路线适当的行动/视图取决于视图模型/结构域的结果

坏:

public ActionResult PlaceOrder(Guid orderid)
{
  if (HttpContext.Session["user"] == null)
    return Redirect("Login");
  if (!ValidOrderId(orderid)) return Redirect();
  var order = cart.Get(orderid);
  if (order == null) { ViewData["orderid"] = orderid; return View("Select"); }
  order.Status = OrderStatus.Placed;
  foreach (var item in order.Items)
    item.Update();
  var cart = Cart.GetCurrent();
  cart.Save(order);
  return Redirect("Show", "Orders", new { orderid = orderid });
}

[Authorize]
[ModelStateToTempData]
// OrderViewModel.Id/OrderViewModel.Instance - validates id, 
// gets it from repository, set Instance or ModelState error
public ActionResult PlaceOrder(OrderViewModel<Order> order)
{
  if (!ModelState.IsValid)
     return View("Select", order);
  var order = order.InstanceFromDatabase;
  _injectedCart.SetOrderPlaced(order);
  return RedirectToAction<OrdersController>(c => c.Show(order));
}

顺便说一句,我很少看到好的MVC例子,包括的NerdDinner。 他们都处理范围内的行为,没有任何视图模型,等业务逻辑。 这通常是因为他们都intendet什么好 - MVC功能演示 - 但它不应该被视为良好的设计实例。 更或多或少很好的例子是CodeCampServer ,与accompanion书ASP.NET MVC在行动一起。 但也不是没有缺点(贫血域模型,例如)。

但是,如果不加以遵循领域驱动设计,而是有一个简单的数据驱动的要求,事情可能会更加容易。



Answer 2:

我努力以脂肪的ViewModels薄控制器,该控制器给工作,我的业务对象。

的NerdDinner是一个很好的示例应用程序,但StackOverflow的是我最喜欢的MVC网站的例子。

善良,



Answer 3:

控制器应包含足够的逻辑来解释什么用户说,跑过处理开了一个服务层之前做。 因此,如果用户说“马克这篇文章是一个我喜欢”,点击喜欢按钮,该控制器可确保用户被授权,然后让我们的服务层手柄实际上做标记后等。如果用户的工作为“创建一个新的博客条目”,那么控制器将收集后,标记,时间戳及其他相关信息,并做最小的数据验证。 然后它将在处理移交给一个服务层。 如果服务层发现的问题,那么就应该抛出一个异常,然后你就可以在控制器处理。



文章来源: MVC How to keep a model skinny [closed]