我在工作中有一个大项目的设计想法,我认为我已经想出了解决方案,但真的很希望能够得到一些反馈,包括a) 总体想法和 b) 我提出的实现方案。
基本思路很简单:我想创建一个ASP MVC应用程序,可以通过添加其他控制器和视图来扩展功能,而无需重新编译代码。这个想法是创建一个MVC应用程序,并添加另一个“Application.dll”来扩展功能,其中包含特定于该应用程序的控制器、数据和业务逻辑。在安装期间,视图将被简单地复制到与主MVC应用程序相同的目录中。
问题是MVC会根据同一程序集内的类型进行路由处理,因此即使我将路由定义移动到数据库中,MvcHttpHandler也无法将任何内容路由到新的DLL中,因为它不“知道”其中的控制器类型。通过查看MVC代码,我发现加载控制器只需要调用Activator.CreateInstance并且仅在当前程序集中查找。
我的解决方法很简单,但可能我遗漏了某些东西:我要么直接替换ControllerFactory(不确定如何做到这一点),要么在派生类中重复该功能并覆盖MvcHttpHandler。新代码将读取请求并首先从当前程序集中加载控制器,然后从扩展的程序集中加载控制器。一旦找到正确的程序集,我就会使用CreateInstance并将该程序集传递给它以获取所需的控制器。