我只是在学习asp.net mvc而我正在试图弄清楚如何将我的控制器转移到一个单独的项目中.通常当我之前设计过asp.net网络应用程序时,我为我的模型创建了一个项目,为我的逻辑创建了另一个项目,然后是网络.
现在我正在学习asp.net mvc我希望遵循类似的模式并将模型和控制器分别放入他们自己的独立项目中,并将views/scripts/css保留在Web中.模型部分很简单,但我不明白的是如何让我的控制器在一个单独的项目中"找到".另外,我想知道这是否可取.谢谢!
首先,将模型放入单独的项目中当然是个好主意.正如你所发现的,这是微不足道的.
关于控制器和视图,我认为在大多数基本项目中将它们分开没有任何明显的优势,尽管您可能特别需要在特定应用程序中这样做.
如果您确实选择这样做,那么您需要告诉框架如何找到您的控制器.执行此操作的基本方法是提供自己的ControllerFactory.您可以查看DefaultControllerFactory的源代码,以了解如何完成此操作.对此类进行子类型化并重写GetControllerType(string controllerName)方法可能足以完成您所要求的内容.
一旦创建了自己的自定义ControllerFactory,就可以将以下行添加到global.asax中的Application_Start,以告诉框架在哪里找到它:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
更新:阅读此帖子 及其链接的帖子以获取更多信息.另见Phil Haack对该帖子的评论:
ControllerBuilder.Current.DefaultNamespaces.Add( "ExternalAssembly.Controllers");
......这不是一个完整的解决方案,但对于简单的案例可能已经足够好了.
虽然创建自己的ControllerFactory是合理的,但我发现在每个项目中定义所有控制器更方便,但是从我的共享项目中的控制器派生它们:
namespace MyProject1.Controllers { public class MyController : MySharedProject.Controllers.MyController { // nothing much to do here... } } namespace MySharedProject.Controllers { public abstract class MyController : System.Web.Mvc.Controller { // all (or most) of my controller logic here... } }
这样做的另一个好处是,您可以放置不同项目的Controller逻辑.此外,其他开发人员更容易快速找到您的Controller逻辑,因为控制器存在于标准位置.
关于这是否可行,我认为绝对是.我已经创建了一些常见的帐户管理逻辑,我希望在项目之间共享,否则这些项目具有非常不同的业务逻辑.所以我正在共享我的帐户和管理控制器,但其他控制器特定于他们各自的项目.