假设我正在开发一个服务台应用程序,该应用程序将由多个部门使用。应用程序中的每个URL都将包含一个指示特定部门的键。关键字始终是系统中每个操作的第一个参数。例如
http://helpdesk/HR/Members
http://helpdesk/HR/Members/PeterParker
http://helpdesk/HR/Categories
http://helpdesk/Finance/Members
http://helpdesk/Finance/Members/BruceWayne
http://helpdesk/Finance/Categories问题是,在对每个请求执行的每个操作中,我必须采用此参数,然后根据该键从存储库中检索Helpdesk Department模型。从该模型中,我可以检索成员、类别等列表,这对于每个Helpdesk部门都是不同的。这显然违反了DRY。
我的问题是,我如何创建一个基本控制器,它为我做这件事,以便URL中指定的特定Helpdesk部门对所有派生的控制器都可用,并且我可以只关注操作?
发布于 2008-09-17 13:29:51
我在我的一个项目中有一个类似的场景,我倾向于使用ModelBinder而不是使用单独的继承层次结构。您可以创建一个ModelBinder属性来从RouteData获取实体/实体:
public class HelpdeskDepartmentBinder : CustomModelBinderAttribute, IModelBinder {
public override IModelBinder GetBinder() {
return this;
}
public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState) {
//... extract appropriate value from RouteData and fetch corresponding entity from database.
}
}...then您可以使用它来使HelpdeskDepartment可用于您的所有操作:
public class MyController : Controller {
public ActionResult Index([HelpdeskDepartmentBinder] HelpdeskDepartment department) {
return View();
}
}发布于 2008-09-16 00:53:01
免责声明:我目前运行的是MVC Preview 5,所以其中一些可能是新的。
最佳实践方法:只需实现一个静态实用程序类,该类提供一个执行模型查找的方法,并将来自操作的RouteData作为参数。然后,从需要该模型的所有操作中调用此方法。
笨拙的方式,因为只有当每个控制器中的每个操作都需要模型时,并且您真的不希望在操作中有额外的方法调用:在您的控制器实现基类中,覆盖ExecuteCore(),使用RouteData填充模型,然后调用base.ExecuteCore()。
发布于 2008-09-16 13:42:45
您可以通过正常的C#继承创建一个基本控制器类:
public abstract class BaseController : Controller
{
}
public class DerivedController : BaseController
{
}您只能将此基类用于需要部门的控制器。无需执行任何特殊操作即可实例化派生控制器。
从技术上讲,这工作得很好。然而,从设计的角度来看,这存在一些风险。如果,正如您所说,所有的控制器都需要一个部门,这是很好的。如果他们中的一些人需要一个部门,它可能仍然是好的。但是,如果一些控制器需要一个部门,而其他控制器需要一些其他继承的行为,并且这两个子集相交,那么您可能会发现自己遇到了多重继承问题。这表明继承不是解决您所陈述的问题的最佳设计。
https://stackoverflow.com/questions/68234
复制相似问题