asp.net mvc把控制器放到一个单独的项目中

我只是学习asp.net mvc,我想弄清楚如何将我的控制器移动到一个单独的项目。 通常,当我devise过asp.net web应用程序之前,我为我的模型创build了一个项目,另一个为我的逻辑创build了一个项目,然后创build了web。

现在我正在学习asp.net mvc,我希望能遵循一个类似的模式,把模型和控制器分别放到他们自己的项目中,然后把views / scripts / css留在网上。 模型部分很容易,但是我不明白的是如何让我的控制器在一个单独的项目中被“发现”。 另外,我想知道这是否可取。 谢谢!

首先,将模型放入单独的项目当然是一个好主意。 正如你所发现的,这是微不足道的。

关于控制器和视图,我没有看到任何明显的优势,分离他们的大多数基本项目,虽然你可能有一个特殊的需要,在一个特定的应用程序这样做。

如果你select这样做,那么你需要告诉框架如何find你的控制器。 这样做的基本方法是提供您自己的ControllerFactory。 您可以查看DefaultControllerFactory的源代码,以了解如何完成此操作。 子类化这个类并覆盖GetControllerType(string controllerName)方法可能足以完成你所要求的。

创build自定义ControllerFactory后,将以下行添加到global.asax中的Application_Start,以告知框架在哪里find它:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

更新:阅读这篇文章 链接到的post以获取更多信息。 另见菲尔·哈克(Phil Haack)对这篇文章的评论:

 ControllerBuilder.Current.DefaultNamespaces.Add( "ExternalAssembly.Controllers"); 

…这不是一个完整的解决scheme,但可能足够简单的情况下。

虽然创build自己的ControllerFactory是合理的,但是我发现在每个项目中定义所有控制器更方便,但是从我的Shared项目中的控制器派生它们:

 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... } } 

这有一个额外的好处,你有一个地方,把你的控制器逻辑,从项目不同项目。 另外,其他开发人员更容易快速find您的控制器逻辑,因为控制器存在于标准的位置。

至于这是否可取,我认为是绝对的。 我已经创build了一些通用的账户pipe理逻辑,我想在不同的业务逻辑之间进行分享。 所以我分享我的帐户和pipe理控制器,但其他控制器是特定于其各自的项目。

我使用的最简单的分离forms是在最初的MVC项目中保留视图“原样”,但删除控制器。 然后在一个新的ClassLibrary项目中添加Controller类,并确保它们inheritance自Controller。

MVC路由引擎将自动路由到ClassLibrary中的控制器,并且控制器将自动从原始MVC项目构build视图,只要您具有正确的引用和使用方式。

我正在使用这个架构来实现一个Html报告模块,它可以与主解决scheme分开编译和部署。 最后,我从SSRS免费!

  • 为您的mvc项目添加类库。
  • 在该类中添加以下代码(对于u'r控制器代码)

     namespace ContactController { public class ContactController : Controller { public ActionResult Call() { ViewBag.Title = "Inside MyFirst Controller."; return View(); } } 

    }

  • 在mvc项目视图文件夹中添加联系人文件夹并创build一个Call.cshtml文件。 查看文件夹

  • 将类库项目引用添加到主MVC项目中。

参考

  • 最后将联系人控制器名称空间引用到路由configuration中。

RouteConfig