如何将ASP.NET MVC应用程序中的模型、视图和控制器分离到不同的程序集中

12

目前我正在尝试学习ASP.NET MVC框架。
对于我的大多数测试应用程序,我使用了单个程序集/项目。这对于一些较小的应用程序来说效果很好。但是,我想知道如何将我的模型、控制器和视图类放入不同的程序集中。在非常大的Web应用程序中,将所有内容放入一个单独的程序集/项目中并不现实。

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

5个回答

6

(未知)是正确的。创建两个项目,一个类库和一个MVC Web项目。MVC项目应引用包含控制器和代码后台文件(global 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

请记住不同的命名空间。然后,您可以创建多个引用相同代码的示例网站。这允许您完全不同地定制您的网站外观。


我刚试了一下,发现我的MVC项目中必须有一个继承自类库中的global.asax文件。除此之外,看起来还不错。 - Nick Randell
将它们分成不同的程序集是否正确?我知道这里提出的问题是如何做到这一点,所以我并不是说这是一个错误的答案。我只想知道什么时候应该考虑这样分离它们。我原本以为在这里解释的链接是正确的方法... https://dev59.com/dF_Va4cB1Zd3GeqPVKGX - user20358

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

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

1

达斯汀:你会推荐这个而不是MVC区域吗?我知道你说的也是可行的,但我没有看到任何MSDN文章说他们支持那样的项目结构。事实上,他们建议使用区域来逻辑地分割应用程序的不同区域... - user20358
@user20358 这篇文章是针对MVC2编写的(支持区域)。在MVC3/4中可能有更好的方法,但我不确定。由于区域被包含在同一项目中,无法满足我的特定需求,我需要它们位于不同的项目中。我不能推荐一种方法胜过另一种方法,这取决于您的需求。 - Dustin Davis
好的。那么将控制器从视图中分离出来的好处是什么呢?例如,将控制器放在一个项目中,将视图放在另一个项目中。我不是质疑您的方法,只是在试图了解以后如何在类似需求的项目中使用它。这是我之前提出的一个问题,帖子中强烈建议使用区域。https://dev59.com/dF_Va4cB1Zd3GeqPVKGX 谢谢您的回复。 - user20358
@user20358 我的原因是因为我正在构建一个内容管理系统。目标是通过其他项目重用控制器和视图。我不会建议这种方法比XYZ更好,这取决于您的需求。 - Dustin Davis

1

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

当然,未知(Google)提供的更简单的答案也可以起作用!


0

仅补充@David的答案:

如果您的项目由NuGet管理,在创建类库后,将packages.config文件复制到类库根目录。然后,您应该编辑每个packages.config文件,根据每个类库的需求添加或删除包。


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