【问题标题】:ASP.NET MVC multi-site designASP.NET MVC 多站点设计
【发布时间】:2014-06-26 14:28:19
【问题描述】:

我正在寻找创建一个新的 MVC 网站,我试图解决的关键问题之一是在公共区域(面向 Web)和内部区域之间共享代码。

基本上,我们有两个应用程序,一个是用户访问的公共网站,另一个将在我们公司内部用于查看一些在公共网站上也可见的相同信息。

我希望将它们保留为两个独立的站点(项目),因为我们有不同的团队负责每个站点,并且因为我们希望使用不同的身份验证格式(用于公众的表单,用于内部的 Windows)。

但是,我们还希望能够在两个站点之间共享一些代码(视图、控制器)。我们如何设置这两个 MVC 站点,以便一个 MVC 站点可以引用另一个项目中的视图和/或控制器?

例如,我们将有一个视图,使内部用户能够查看我们公共网站用户的交易历史。如果我们在内部站点中创建了该控制器/视图,然后我们想在公共站点中添加该控制器/视图,我们如何在公共站点上重复使用相同的视图?

【问题讨论】:

  • 您可以将您的控制器和视图封装在一个程序集中,然后像任何库一样共享它。您还可以将核心逻辑放入库中,然后将控制器包装在其中。
  • MVC的路由配置知道如何处理吗?
  • 路由并不特定于 MVC。路由实际上将请求交给 mvc,这就是启动 mvc 进程的原因。
  • 如果您尝试将控制器类放入共享程序集中,我认为您需要对路由进行一些配置来告诉它要查看哪个命名空间。
  • 无论如何,您都需要为您的路线进行一些配置。

标签: asp.net asp.net-mvc


【解决方案1】:

从技术上讲,正如其他人已经说过的那样,您可以将想要共享的所有内容放在类库项目中,然后从其他项目中引用该项目。视图有点不同,为了在项目之间共享它们,您必须编译它们。为此,您需要 Razor Generator

但实际上,很少会在项目之间共享视图(除了布局之类的东西),而且几乎不存在应该共享控制器的情况。如果重叠如此之大,那么这两个项目实际上应该是两个项目,而是一个,这是一个论点。控制器和视图是为应用程序定制的,以至于在大多数情况下共享它们是没有意义的。然而,分享您的模型和其他类是一个非常好的主意。

【讨论】:

  • 这是我为即将到来的项目正在进行的研究的一部分。我的想法是,我们应该将站点保存在一个代码库中,因为它们会大量共享代码,但我正在探索将它们分开的选项。感谢您的意见
  • 单一解决方案,绝对。但是,如果您有一个内部站点和一个外部站点,那么它们应该是单独的项目。如果它们是一个,您可以在 IIS 中实现某种程度的访问控制,但作为两个,如果需要,您可以将它们放在完全不同的子网中的完全不同的服务器上。这为您提供了更多的安全选择:内部站点进入防火墙后面的内部服务器,外部站点进入与您的基础设施的其余部分分开的 DMZ。
  • 我的论点仅仅是你应该创建单独的控制器,例如,而不是试图将功能从一个到另一个。
  • 如果我要使用 Razor Generator 将我的观点分享给不同的项目,我是否会将它们保存在单个 MVC 项目中,以便我可以轻松搭建等,并有选择地与 Razor Generator 共享它们?或者将视图放在类库中会更好吗? -编辑:啊,在 Razor Generator 的 codeplex 上,他们建议使用 MVC 项目而不是类库
  • 本质上是一样的。他们推荐 MVC 项目的唯一原因是您不必担心安装 MVC 项目默认附带的一些 nuget 包。不过,无论哪种方式都行得通。
【解决方案2】:

我能想到的两种方法:

第一个选项是使用 MVC 区域。它为每个区域提供不同的控制器/视图,同时共享相同的模型。您还可以将常用方法封装在 Helper 类中。

第二个选项,创建 3 个项目。一个是 .NET 库,包含通用逻辑、模型、验证、发送电子邮件等。然后再创建 2 个 MVC 项目,每个站点一个,并引用该项目。

【讨论】:

    【解决方案3】:

    考虑在您的站点中使用区域(这将允许您保持项目独立,但作为一个最终解决方案一起使用)。此外,请考虑在另一个库中编译您的视图,以便您可以在项目之间共享它们。

    一些参考资料:

    【讨论】:

    • @Mike:嵌套是有意的,因为它与编译视图有关。
    猜你喜欢
    • 2017-04-18
    • 2012-03-12
    • 2013-07-11
    • 2017-05-28
    • 1970-01-01
    • 2011-06-07
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多