问题 如何将ASP.NET MVC应用程序中的模型,视图和控制器分成不同的程序集


目前我正试图进入ASP.NET MVC框架。
对于我的大多数测试应用程序,我使用了一个程序集/项目。这适用于一些较小的应用程序。然后我想知道如何将模型,控制器和视图类放入单独的程序集中?在非常大的Web应用程序中,将所有内容放入单个程序集/项目中并不现实。

所以我的问题是:是否有可能告诉ASP.NET MVC框架在另一个程序集中搜索视图和/或控制器而不会失去路由引擎的内置灵活性?


10347
2018-05-26 10:54


起源



答案:


(未知)是正确的。创建两个项目,一个类库和一个MVC Web项目。 MVC项目应该引用包含控制器和代码隐藏文件(全局asax等)的类库。这是一个示例布局。

类库应该只包含.cs文件而不包含视图(.aspx / .ascx文件)。

MyProject.BaseSite(类库)
    +控制器
         -  HomeController.cs
         -  ......任何其他控制器
     -  default.aspx.cs
     -  global.asax.cs

MVC Web项目应包含配置,视图等以及对类库的引用

MyProject.ExampleSite
    +内容
        +脚本
        + css
        +图像
    +观点
        +家
             -  index.aspx
             -  ..其他aspx文件
        +共享
             -  Site.master
     -  web.config

记住不同的命名空间。然后,您可以创建多个引用相同代码的示例网站。这使您可以完全不同地有效地为您的网站着色。


6
2018-05-26 22:53



我刚试过这个,并且必须在我的mvc项目中有一个global.asax,它继承自我类库中的那个。除此之外看起来还不错。 - Nick Randell
采用将它们分成不同组件的方法是正确的。我知道这里问的问题是怎么做,所以我不是说这是一个错误的答案。我只想知道何时应该考虑将它们分开。我的印象是,这里的链接解释是正确的方式.. stackoverflow.com/questions/8988472/mvc-3-project-structure - user20358


答案:


(未知)是正确的。创建两个项目,一个类库和一个MVC Web项目。 MVC项目应该引用包含控制器和代码隐藏文件(全局asax等)的类库。这是一个示例布局。

类库应该只包含.cs文件而不包含视图(.aspx / .ascx文件)。

MyProject.BaseSite(类库)
    +控制器
         -  HomeController.cs
         -  ......任何其他控制器
     -  default.aspx.cs
     -  global.asax.cs

MVC Web项目应包含配置,视图等以及对类库的引用

MyProject.ExampleSite
    +内容
        +脚本
        + css
        +图像
    +观点
        +家
             -  index.aspx
             -  ..其他aspx文件
        +共享
             -  Site.master
     -  web.config

记住不同的命名空间。然后,您可以创建多个引用相同代码的示例网站。这使您可以完全不同地有效地为您的网站着色。


6
2018-05-26 22:53



我刚试过这个,并且必须在我的mvc项目中有一个global.asax,它继承自我类库中的那个。除此之外看起来还不错。 - Nick Randell
采用将它们分成不同组件的方法是正确的。我知道这里问的问题是怎么做,所以我不是说这是一个错误的答案。我只想知道何时应该考虑将它们分开。我的印象是,这里的链接解释是正确的方式.. stackoverflow.com/questions/8988472/mvc-3-project-structure - user20358


为每个职责层创建一个单独的类库项目,编译以创建程序集,然后在适当的应用程序中引用它们。


2
2018-05-26 11:11



你的意思是举例,而不是在我的主程序集中使用文件夹“Views”,我可以简单地创建一个名为“MyProject.Views”的类库? - Alexander
嗯我测试了这个,但它不起作用! MVC框架仍然会将所有内容存储在主程序集中。 - Alexander
我的意思是基本上将您的代码分组到相关项目中,并将它们编译为单独的库类,这将生成程序集。然后,您只需在项目中引用需要访问它们的程序集。我保证你的工作...... - James
我认为您正在为您的网站项目添加类,然后编译为Web应用程序....这将确实为所有人生成1个程序集。您需要创建单独的类库项目并将类移动到每个项目中,然后单独编译。 - James


是的,如果您使用其中一个支持的 依赖注入 容器,然后它们的配置数据通常不仅指定要响应特定查询而加载的类,还指定要从中加载它的程序集。这允许您在任意程序集中拆分类,MVC仍然可以找到它们。

当然,虽然Unknown(谷歌)提供的更简单的答案也可行!


1
2018-05-26 11:12





我意识到这是一个非常古老的问题,但我写了一篇关于如何准确要求的文章

http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate-assemblies.aspx


1
2018-06-19 20:21



达斯汀:你会推荐MVC领域吗?我知道你说什么也是可行的,但我没有看到任何MSDN文章说他们支持这样的项目结构。事实上,他们建议使用区域来逻辑划分应用程序的不同区域...... - user20358
@ user20358这篇文章是为MVC2(支持的领域)编写的。在MVC3 / 4中可能有更好的方法,我不确定。区域不符合我的特定需求,因为它们包含在同一个项目中,我需要它们在不同的项目中。我不能推荐一种方法而不是另一种方法,这取决于你的需求。 - Dustin Davis
好。因此,将控制器与视图分开的原因可能是个好理由,例如在一个项目中有控制器,在另一个项目中有视图......我不是在质疑你的方法,而只是试着教育自己在未来的项目中使用什么,如果我有的话类似的需求..这是我之前问过的一个问题,帖子强烈建议使用区域。 stackoverflow.com/questions/8988472/mvc-3-project-structure   感谢您的回复。 - user20358
@ user20358我的原因是因为我正在建立一个CMS。目标是通过其他项目重用控制器和视图。我不打算建议这种方法比XYZ好,这取决于你的需求。 - Dustin Davis


只完成@ David的回答:

如果您的项目由管理 NuGet,在创建类库后,执行您的副本 packages.config 文件到类库的根目录。之后,您应该编辑每个 packages.config 文件添加或删除包,根据每个类库的需要。


0
2017-12-14 16:08