MVC:如何使用具有许多子实体的实体?

Gid*_*don 9 asp.net-mvc

在ASP.NET MVC的当前示例中,我看到了非常基本的实体,使用简单的CRUD方法.
但我不确定如何处理更高级的模型.让我举个例子:

我们有一个车库网站.车库有:

  • 库存用 carparts
  • Employees
  • Customers
  • Cars 这包括车库里的所有车辆

现在让我们来看看car,汽车可能有一个在汽车employees上工作的集合(从原始employee类派生,添加一些额外的道具将他绑在汽车上),一组carparts已被替换(也派生,例如添加) SerialNr和ReplacementDateprop),当然customer也是拥有汽车的客户的支柱.

现在rest我希望看到以下内容:

/cars/423 [get]                  //show car # 423
/cars/423/edit [get]             //shows the edit form (ajax enabled, so also shows the other props)
/cars/423/carparts [get]          //gets the carparts inside the car
/cars/423/carparts/32/edit [post] //updates that specific carpart inside the specific car
/cars/423/employees [get]         //gets the employees who worked on the car
/inventory [get]
/inventory/1234/edit [get]        //gets the update form for carpart with ID 1234                   
/employees [get]                  //gets all the employees in the company
Run Code Online (Sandbox Code Playgroud)

那么我将如何构建我的控制器?我应该为子元素添加所有这些CRUD方法CarsController吗?由于数十种方法(这种模式过于简化,汽车有更多的亲子关系),这不是一个非常胖的控制器吗?或者我应该创建一个EmployeesInCar控制器(看起来很糟糕)...非常感谢.

编辑:
首先,这个例子只是假设,只是一个例子.
如果我按照这个建议,我会有一个CarController只处理汽车.我的PartsController只处理Parts.但是我们有两套Parts,一套(用于库存); 而且我们有一个Part汽车内部,它来自一般汽车,但增加了诸如SerialNumber和之类的属性ReplacementDate.
所以我的部件控制器变得非常胖,例如让我们调用实体:GeneralPart(在库存中)和SpecificPart(派生类,具有额外的属性)

Index -> Returns all GeneralParts in inventory.
IndexByCar(int id) -> Return all SpecificParts by Car.
etc. etc.
Run Code Online (Sandbox Code Playgroud)

因为每个操作都涉及通用部件或特定部件.对于员工来说也是如此,我们拥有基本员工类,以及具有额外属性的特定员工类.

jri*_*sta 1

如果您希望使用示例中提供的路径类型,那么听起来您应该学习如何使用 .NET 3.5 中的路由引擎。您应该能够使用所需的 url 类型,但您需要创建多个自定义路由,可能还需要创建一个自定义路由处理程序来完成它。.NET 3.5 中的路由引擎非常灵活,并不是专门为 MVC 设计的……它实际上非常通用,可以提供非常广泛、可能无限范围的 url 重写。

我住的地方有点晚了,所以我试图写的例子还没有形成。:P 可以说,自定义路由处理程序和一些新的路由映射应该可以帮助您到达所需的位置。

编辑:这可能有帮助:

http://codingcockerel.co.uk/2008/05/26/custom-routing-for-asp-net-mvc/

编辑2:我之前遗漏了控制器。路由只是让您能够使用您想要的 URL 类型。这是一件好事...您提出的 URL 类型将长期提供更好的 SEO 体验。至于组织控制器,我建议保持简单:

/Controllers/CarsController.cs
/Controllers/PartsController.cs
/Controllers/EmployeesController.cs
/Controllers/InventoryController.cs
Run Code Online (Sandbox Code Playgroud)

您的路由将与您的 url 模式相匹配,并将它们转换为通往控制器的正确路由,获取 ID 并将它们与您的操作参数进行匹配。

编辑3:

所以,既然我更全面地理解了你的问题,我希望我能更好地回答它。一般来说,我认为控制器应该与您的实体进行 1:1 映射。如果您有 GeneralPart,那么您应该有一个专门用于管理通用部件的控制器。如果您有 CarPart,那么您应该有一个专门用于管理汽车零件的控制器。如果 CarParts 是 GeneralParts,并且在某些情况下它们的行为类似于 GeneralParts,那么最好将这些管理方面放在 GeneralPartsController 上,除非该管理处理 CarPart 的任何特殊属性...在这种情况下,应委派管理到 CarPartsController。多态性如何在控制器组织中发挥作用,以及“是”关系如何允许您重用控制器来管理多种类型,这是一种优雅的方式。

老实说,您遇到了一个相当复杂的场景,我在使用 ASP.NET MVC 时没有直接遇到过。我尽量避免这种情况,因为它们会引起像这样的复杂问题,而这些问题的答案往往是主观的。最终,您应该以一种对控制器的使用方式、它们如何映射到您的实体以及它们如何组织您感兴趣的行为具有逻辑意义的方式来组织控制器。有时,将所有控制器映射到单个实体是不合逻辑的。有时,您需要一个“复合”控制器来处理同时对多个实体或实体图进行操作的操作。在这些情况下,最好让控制器专用于这些特定的行为组,而不是试图找到一个“有点适合”的特定于实体的控制器。