asp.net webapi控制器的设计考虑因素

时间:2013-08-30 08:12:21

标签: asp.net-web-api

我是EF4的MVC WebAPI新手。我想知道是否最好将具有多个GET和/或PUT方法的大型控制器拆分为多个控制器,以避免“发现与请求匹配的多个操作”错误。我更喜欢仅使用基于VERB的路由模式“api / controller / id”,如下所示。

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
"Api",
"api/{controller}/{id}",
new { id = RouteParameter.Optional }
);

例如,我有两个域对象,Doctor和Patient。 ClinicController具有以下操作:

getDoctors()
getPatientCohort(int doctorId) 
getPatientPrimaryDr(int patientId) 
getPatientDoctors(int patientId, int clinicId)
getPatients()
getPatient(int patientId)
putDoctor(Doctor doctor)
putPatient(Patient patient)
createDoctor(Doctor doctor)
createPatient(Patient patient)

我应该将此控制器拆分为DoctorController和PatientController,以便每个控制器只处理一个域对象。由于Patient Cohort是一个关联类,getPatientCohort(int doctorId)应该是PatientController还是DoctorController的方法?感谢。

1 个答案:

答案 0 :(得分:0)

在我看来(我明确说明了这一点),你应该为每个模型创建单独的控制器。这实际上取决于行动本身的目的,但我可能会猜测出意图并大致将其分开。

Put和Create方法应该驻留在他们自己的控制器中,因为这(我再次假设)与Clinic无关。患者和医生刚刚被创建或更新(替换),这在他们自己的控制器中完全没问题。如果将患者或医生分配到诊所,则诊所控制器内部应该采取单独的措施来执行此操作。

任何以Patient模型为基础并检索相关模型的动作也应该驻留在PatientController中;类似于博士模型。

所以从本质上讲,归结为:

  • 任何特定于模型的操作都应该在该模型的控制器中。
  • 检索关联模型的任何模型特定操作都应驻留在主模型的控制器中。
  • 任何绑定操作都可以驻留在将两者绑定在一起的任一控制器中。

这类似于OData框架处理动作和关联的方式,因此我更习惯于以这种方式实现它。希望这能为您解决一些问题(或者至少提供一些指导原则)。