【问题标题】:How to separate model, view and controller in an ASP.NET MVC app into different assemblies如何将 ASP.NET MVC 应用程序中的模型、视图和控制器分离到不同的程序集中
【发布时间】:2009-05-26 10:54:07
【问题描述】:

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

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

【问题讨论】:

    标签: .net asp.net asp.net-mvc .net-assembly


    【解决方案1】:

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

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

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

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

    MyProject.ExampleSite + 内容 + 脚本 + CSS + 图片 + 意见 + 主页 - 索引.aspx - .. 其他 aspx 文件 + 共享 - Site.master - web.config

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

    【讨论】:

    • 我刚试过这个,我的 mvc 项目中必须有一个 global.asax,它继承自我的类库中的那个。除此之外,它看起来还可以。
    • 采用将它们分成不同程序集的方法是否正确。我知道这里提出的问题是如何做到这一点,所以我并不是说这是一个错误的答案。我只是想知道什么时候应该考虑像那样将它们分开。我的印象是,这里的链接中解释的方法是正确的.. stackoverflow.com/questions/8988472/mvc-3-project-structure
    【解决方案2】:

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

    【讨论】:

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

    是的,如果您使用受支持的dependency injection 容器之一,那么它们的配置数据通常不仅指定要加载以响应特定查询的类,还指定要从中加载它的程序集。这允许您将您的类拆分到任意程序集,MVC 仍然能够找到它们。

    当然,Unknown (Google) 提供的更简单的答案也可以使用!

    【讨论】:

      【解决方案4】:

      我意识到这是一个非常古老的问题,但我写了一篇文章,说明如何准确地满足您的要求

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

      【讨论】:

      • Dustin:你会推荐 MVC 领域。我知道你说的也是可行的,但我没有看到任何 MSDN 文章说他们支持这样的项目结构。事实上,他们建议使用区域在逻辑上划分出应用程序的不同区域......
      • @user20358 这篇文章是为 MVC2(它支持的领域)写的。在 MVC3/4 中可能有更好的方法来做到这一点,我不确定。区域不满足我的特定需求,因为它们包含在同一个项目中,我需要它们在不同的项目中。我不能推荐一种方法而不是另一种方法,这取决于您的需求。
      • 好的。那么将控制器与视图分开可能是一个很好的理由..就像在一个项​​目中拥有控制器而在另一个项目中拥有视图一样..我不是在质疑您的方法,而只是试图教育自己在未来的项目中使用什么,如果我有的话类似的需求.. 这是我之前提出的一个问题,这些帖子强烈建议与区域一起使用。 stackoverflow.com/questions/8988472/mvc-3-project-structure谢谢你的回复。
      • @user20358 我的原因是因为我正在构建一个 CMS。目标是其他项目重用控制器和视图。我不会建议这种方法比 XYZ 更好,这取决于您的需求。
      【解决方案5】:

      只完成@David 的回答:

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

      【讨论】:

        猜你喜欢
        • 2017-07-05
        • 2015-07-21
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多