向ASP MVC添加控制器工厂

14

我在工作中有一个大项目的设计想法,我认为我已经想出了解决方案,但真的很希望能够得到一些反馈,包括a) 总体想法和 b) 我提出的实现方案。

基本思路很简单:我想创建一个ASP MVC应用程序,可以通过添加其他控制器和视图来扩展功能,而无需重新编译代码。这个想法是创建一个MVC应用程序,并添加另一个“Application.dll”来扩展功能,其中包含特定于该应用程序的控制器、数据和业务逻辑。在安装期间,视图将被简单地复制到与主MVC应用程序相同的目录中。

问题是MVC会根据同一程序集内的类型进行路由处理,因此即使我将路由定义移动到数据库中,MvcHttpHandler也无法将任何内容路由到新的DLL中,因为它不“知道”其中的控制器类型。通过查看MVC代码,我发现加载控制器只需要调用Activator.CreateInstance并且仅在当前程序集中查找。

我的解决方法很简单,但可能我遗漏了某些东西:我要么直接替换ControllerFactory(不确定如何做到这一点),要么在派生类中重复该功能并覆盖MvcHttpHandler。新代码将读取请求并首先从当前程序集中加载控制器,然后从扩展的程序集中加载控制器。一旦找到正确的程序集,我就会使用CreateInstance并将该程序集传递给它以获取所需的控制器。

2个回答

7

本文的结尾展示了如何实现自己的ControllerFactory。基本上,您需要从DefaultControllerFactory派生,然后在global.asax中的Application_Start()方法中进行连接。


1

控制器工厂的想法并没有错,只要它仅仅是为了以后的灵活性。问题在于当你把属于其他层的代码加载到控制器中时,这就是你可能需要其他控制器灵活性的原因之一。只要你不把各个层混合在一起,我认为工厂的想法没有真正的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接