2013-08-30 108 views
1

我是MVC WebAPI和EF4的新手。我想知道是否最好将多个GET和/或PUT方法的大型控制器拆分为多个控制器,以避免“找到与请求匹配的多个操作”错误。我更喜欢只使用基于VERB的路由模式“api/controller/id”,如下所示。asp.net webapi控制器的设计考虑因素

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的方法?谢谢。

回答

0

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

Put和Create方法应该驻留在它们自己的控制器中,因为这(同样,我假设)与诊所无关。患者和医生只是创建或更新(替换),这在他们自己的控制器中是完美无缺的。如果病人或医生被分配到诊所,应在诊所控制器内单独采取行动。

以Patient模型为基础并检索关联模型的任何操作也应驻留在PatientController中;类似于Doctor模型。

所以它在本质上归结为:

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

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