【问题标题】:Is it possible to make separate dlls with MVC project?是否可以使用 MVC 项目制作单独的 dll?
【发布时间】:2015-11-03 21:41:47
【问题描述】:

我们有一个用 Asp.net MVC5 开发的大项目。我们的模型和业务逻辑在单独的类库中定义。现在我们需要向现有项目添加另一个模块,但我们需要一个单独的 dll。

这个模块还分享了最多的javascripts、css文件和其他文件。这就是我们不想分离 MVC 项目的原因。

为什么我们可以为模块创建单独的 dll。所以我们不想部署或接触其他 dll。

【问题讨论】:

  • 是的,您可以拥有任意数量的程序集。

标签: c# asp.net asp.net-mvc dll


【解决方案1】:

根据您的描述,您说项目共享 CSS 和 JS 文件。这使我相信您正在谈论一个单独的 MVC 网站(可能是较大公司网站的一部分)。这可以通过使用区域最简单。如果您不熟悉Areas,请阅读以下内容:https://msdn.microsoft.com/en-us/library/ee671793(VS.100).aspx

当然,使用区域将要求您在每次更改区域之一时部署整个站点,并且您已经提到要避免这样做。

如果您不想使用区域,而是想在同一个解决方案中创建另一个 MVC 项目,您也可以轻松地做到这一点。您可以右键单击解决方案,添加新项目 > ASP.NET Web 应用程序 > MVC 以添加项目。要在这两个 MVC 项目之间共享 JS 和 CSS 文件,您必须创建一个新的解决方案文件夹(右键单击解决方案 > 添加新解决方案文件夹),并将您的资源文件移动到该文件夹​​。在解决方案中的每个 MVC 项目中,您将添加现有项目并选择那些 js/css 资源文件。这样,如果您更改 css 文件,它将反映在两个项目中。

有关更多信息,请阅读以下内容:

How do you share scripts among multiple projects in one solution?

【讨论】:

    【解决方案2】:

    是的,您可以,只需将逻辑类添加到其他类库项目(您可以拥有任意数量),然后将这些类库的引用添加到 mvc 项目。 不要忘记在代码中导入类

    编辑:我假设您使用的是 Visual Studio,如果是,您可以转到文件 -> 创建项目,这将在同一解决方案中创建另一个项目。

    【讨论】:

      【解决方案3】:

      我不知道您是否尝试过Managed Extensibility Framework (MEF)。这个framework 可以按您的要求工作...我认为下面的链接会为您提供更多帮助

      ASP.NET MVC Extensibility with MEF

      How to integrate MEF with ASP.NET MVC 4 and ASP.NET Web API

      http://www.codeproject.com/Articles/167321/MEF-with-ASP-NET-Hello-World

      【讨论】:

        【解决方案4】:

        其他人发布了有关使用区域的答案。地区很棒,很好,很有帮助。它们确实有利于项目结构。

        这个模块还分享了最多的javascripts、css文件和其他文件

        您问题的标题是关于 .dll 的,但我怀疑客户端资源是主要问题。

        如果您认为您的 web 应用程序有两个不同的部分:服务器端和客户端,您可以使用适当的策略来模块化每个部分。非常适合组织服务器端代码的区域,但对前端没有帮助。

        ASP.NET 5 扩展了前端包管理选项。除了传统的 NuGet 包管理器之外,现在还支持 Bower 和 NPM。例如,考虑如何this article demonstrates installing jQuery via NPM。这是另一篇关于setting up NPM, Bower, and Gulp in Visual Studio 的好文章。

        怎么做:获取现有的客户端代码并制作自定义 NPM 或 Bower 包,然后从一个或多个 Asp.NET 项目中使用该包。

        【讨论】:

          【解决方案5】:

          我可以向您推荐两种种方式来组织您的多模块项目。

          选项 1 - 在同一个 Web 项目中为每个模块创建 区域

          一种方法是在同一个 MVC 项目中创建单独的 Area。所以每个模块都有一个单独的区域,有单独的控制器、视图、脚本等。但是,
          (1) 这仍然会为整个 MVC 项目创建一个 dll
          (2) 在某些情况下,跨区域共享文件可能不是很容易(您可以将所有模块的所有脚本保存在一个共享目录中)

          选项 2 - 为每个模块创建 类库,在构建后合并

          另一种方法是为每个模块创建一个 class library 项目。添加对System.Web.Mvc 和其他库的引用,以便它可以拥有controllers 等。创建您自己的视图、脚本和其他文件夹,并根据需要填充文件。

          现在,您的所有模块都将构建为单独的项目,包含 dll 文件和 javasvripts、htmls、csss、图像等。使它们都作为单个 @987654331 工作@你可以创建一个(只有一个)MVC web 项目,该项目将进入 IIS 虚拟目录,并将作为 web.xml 发布。

          要使用来自同一 Web 的所有单独模块,您可以在所有这些库中编写 post build 事件,以将工件(dll、脚本等)复制到主 Web 中的相应文件夹(dll 到 \bin, javascript 到 \scripts 等)。因此,在成功构建之后,所有工件都可以在同一个 Web 项目中使用,并且可以部署为包含所有模块的单个 Web。您的后期构建脚本应如下所示

          XCOPY "$(ProjectDir)$(OutDir)*.*" "$(ProjectDir)..\YourMainWebDirectory\Bin\" /Y
          XCOPY "$(ProjectDir)Content"  "$(ProjectDir)..\YourMainWebDirectory\Content\"  /S /Y
          XCOPY "$(ProjectDir)Scripts"  "$(ProjectDir)..\YourMainWebDirectory\Scripts\"  /S /Y
          XCOPY "$(ProjectDir)Views"  "$(ProjectDir)..\YourMainWebDirectory\Views\"  /S /Y
          XCOPY "$(ProjectDir)Images"  "$(ProjectDir)..\YourMainWebDirectory\Images\"  /S /Y
          

          现在,
          (1) 您有单独的模块用于单独的 dll
          (2) 可以直接共享脚本和其他文件,因为它们将在同一位置(构建后)
          (3) 如果您决定从 Web 中删除特定模块,只需从该模块(项目)中删除构建后事件,而不影响其他任何内容。您可以随时将其添加回来。

          您的整体solution 看起来像

          Module01.csproj => post build copy to main
              \Controllers
              \Scripts
              \Views
              \Contents
              \Images
          
          Module02.csproj => post build copy to main
              \Controllers
              \Scripts
              \Views
              \Contents
              \Images
          
          Models.csproj
              \...
          
          Application.csproj
              \...
          
          Main.Web.csproj => main web application hosted in IIS
              \Controllers
              \Scripts
              \Views
              \Contents
              \Images
          

          【讨论】:

            猜你喜欢
            • 2021-09-08
            • 1970-01-01
            • 1970-01-01
            • 2010-12-16
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多