Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一个大型MVC4应用程序划分为多个较小的应用程序?_C#_Asp.net Mvc 4_Visual Studio 2013 - Fatal编程技术网

C# 如何将一个大型MVC4应用程序划分为多个较小的应用程序?

C# 如何将一个大型MVC4应用程序划分为多个较小的应用程序?,c#,asp.net-mvc-4,visual-studio-2013,C#,Asp.net Mvc 4,Visual Studio 2013,在Visual Studio 2013中,我有一个“ASP.NET MVC 4 Web应用程序”,分为多个区域 该项目的规模越来越大,以至于我目前在应用程序中有很多领域 在另一个MVC4应用程序中,有一个特定的区域可以单独分开。我创建了一个新的MVC4应用程序,并将此区域移动到该应用程序 这些是我面临的问题: 移动区域使用原始应用程序中其他类的代码。具体来说,有一个共享区域包含一些属性以及一个BaseController 移动区域的视图还使用JS脚本和其他内容。大多数情况下,所使用的脚本不是独占

在Visual Studio 2013中,我有一个“ASP.NET MVC 4 Web应用程序”,分为多个区域

该项目的规模越来越大,以至于我目前在应用程序中有很多领域

在另一个MVC4应用程序中,有一个特定的区域可以单独分开。我创建了一个新的MVC4应用程序,并将此区域移动到该应用程序

这些是我面临的问题:

  • 移动区域使用原始应用程序中其他类的代码。具体来说,有一个共享区域包含一些属性以及一个BaseController
  • 移动区域的视图还使用JS脚本和其他内容。大多数情况下,所使用的脚本不是独占的,也不是特定于使用它们的区域。因此,内容在许多领域之间相互参照
  • 以下是我尝试过的:

  • 为了解决编译错误,我尝试将旧MVC应用程序中的引用添加到新MVC应用程序中,以便新应用程序中的类可以看到旧应用程序中的其他类,例如共享区域中的类。然而,这似乎并没有解决问题
  • 为了修复JS脚本和内容问题,我创建了一个解决方案文件夹,并将所有脚本移动到其中。但是,由于编译错误,我无法验证这是否有效,因为我可以启动应用程序
  • 以下是我的问题:

  • VS2013是否提供了一些工具来分离MVC应用程序或使一个应用程序引用另一个应用程序的代码和内容
  • 你认为进行这种分离的最佳策略是什么

  • 我试着在SO和Google上搜索如何实现这样的分离。然而,我的发现似乎适用于MVC和VS的早期版本。因为我对MVC区域和MVC的概念不太熟悉,所以我无法回避这个问题。

    我会对这个问题采取更一般的观点。这不是一个ASP.NET MVC问题,而是一个.NET代码组织问题。我不相信有任何一种特定的规范方法,而是根据您的偏好和项目/团队的工作方式,提供一些通用的指导方针

    我将重点关注的总体项目是将代码拆分为单独的程序集并创建一个资产管道

    拆分程序集允许项目根据需要独立编译和重新编译。如果您需要在web服务中跨多台机器进行拆分,并在其他相关项目(如WCF服务)中重复使用,或者如果您需要根据自己的需求执行GAC特定程序集之类的操作,那么这将带来额外的好处

    将东西放到管道中只会使共享和管理一切变得更容易

    以下是一些建议:

    • 您不需要在解决方案中为所有听起来像您拥有的东西设置一个整体项目。将事物划分为多个项目,从而生成多个程序集。您还可以为应用程序的独立部分提供多个解决方案,而不需要运行其他部分

    • 从应用程序中共享的任何“后端”和“业务”逻辑开始。例如,如果您有一个由多个视图使用的CustomerService类,请将其放入类似MyCompany.MyApp.Services的内容中。显然,如果你最终添加了很多项目,你得到的粒度越细,你的命名可能就越具体

    • 特别是对于MVC类型的项目,通常很容易将模型拆分为一个或多个程序集。示例:MyCompany.MyApp.SomeGroupingName1.Models和MyCompany.MyApp.SomeGroupingName2.Models,或作为MyCompany.MyApp.Models合并为1

    • 也可以将控制器拆分为多个程序集,与上一点相同

    • 您也可以将UI中的任何类型的组件抽象为它们自己的程序集,视图也是如此

    • 使用您提到的解决方案文件夹

    • 如果需要,引入资产管理库以帮助构建和解决资源捆绑问题。如果库还没有这样做,您可以创建一个资产管道,将其插入其中,以缩小css和js。然后在你的应用程序中,你只需在你需要的页面中引用你需要的捆绑包,而不是总是在每个页面中手动包含所有内容或在整个应用程序中共享整个站点中的所有内容

    • 如果可能的话,更喜欢组合而不是继承。从你的帖子中还不清楚,但我看到很多人在试图为每个控制器、视图等实现一个一规则的基类时遇到了问题。正如他们所说,这可能会起作用,直到它不起作用为止。使用基类和继承仍然是一个好主意,但是不要将多个做不同事情的东西绑定到同一个基类实现。在这一点上,如果您需要强制执行某种契约,那么接口可能更符合您的需要


    最后一点:如果您将内容捆绑到内容管道中,那么如果您操作正确,客户端将最小化他们下载脚本的次数,并且您可以让浏览器尝试将其缓存到其他页面。有时,将一个大文件向下推一次比在每个页面上建立多个网络连接到不容易缓存的不同文件或视图中内联的内容要好。

    感谢这些有用的指导原则。我会尽可能多地关注它们。我想补充一点,看看NuGet,并将一些共享代码(如javascript和css)打包到一个包中,以便在您的项目中共享。@TombMedia是的,我实际上刚刚了解NuGet,以及如何使用它来促进我想要完成的许多任务,谢谢,你可以把它像答案一样分开,然后把分开的部分打包。挑战在于决定凝聚力:)