能否在MVC项目中创建独立的dll文件?

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

这个模块还共享大部分JavaScript、CSS文件和其他文件,这就是我们不想分离MVC项目的原因。是否有办法按模块基础创建单独的dll文件,这样我们就不需要部署或触及其他dll文件了。

是的,您可以拥有任意数量的程序集。 - Matthew
5个回答

6
根据您的描述,您说这些项目共享CSS和JS文件。这让我相信您在谈论一个单独的MVC网站(可能是较大企业网站的一部分)。使用区域可能是最容易的方法。如果您不熟悉区域,请阅读以下内容:https://msdn.microsoft.com/en-us/library/ee671793(VS.100).aspx 当然,使用区域将要求您每次更改其中一个区域时部署整个站点,而您已经提到您想避免这样做。
如果您不想使用区域,而是想在同一解决方案中创建另一个MVC项目,也很容易实现。您可以右键单击解决方案,添加新项目 > ASP.NET Web应用程序 > MVC 来添加该项目。为了在这两个MVC项目之间共享JS和CSS文件,您将需要创建一个新的解决方案文件夹(右键单击解决方案 > 添加新解决方案文件夹),并将资源文件移动到该文件夹中。在您解决方案中的每个MVC项目中,您将添加现有项并选择那些js/css资源文件。这样,如果您更改了css文件,它将反映在两个项目中。

欲了解更多信息,请参阅以下内容:

如何在一个解决方案中的多个项目之间共享脚本?



1
可以的,只需将逻辑类添加到其他类库项目中(您可以有多个),然后将这些类库的引用添加到mvc项目中。 不要忘记在代码中导入这些类。
编辑:我假设您正在使用Visual Studio,如果是,请转到文件->创建项目,这将在同一解决方案中创建另一个项目。

0

我可以向您建议两种组织多模块项目的方式。

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

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

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

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

现在,您的所有模块都将作为单独的项目构建,包括 dll 文件和 javascripthtmlcss、图像等。要使它们作为一个单一的 web 应用程序 工作,您可以创建一个(仅一个)MVC web 项目,该项目将进入 IIS 虚拟目录,并作为 web 发布。

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

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)如果您决定从网站中删除特定模块,只需从该模块(项目)中删除后生成事件即可,而不会影响其他任何内容。您随时可以添加回去。

您的整体解决方案将如下所示:

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

0

其他人已经发布了关于使用区域的答案。 区域非常好,有益和有帮助。 它们确实有利于项目结构。

此模块还共享大多数JavaScript、CSS文件和其他文件

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

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

ASP.NET 5的前端包管理选项已扩展。 除了传统的NuGet软件包管理器外,现在还支持Bower和NPM。 例如,请考虑如何通过NPM安装jQuery的本文演示。 这里有另一篇关于在Visual Studio中设置NPM、Bower和Gulp的好文章。

操作步骤:将您现有的客户端代码制作成自定义的 NPM 或 Bower 包,然后从一个或多个 Asp.NET 项目中使用该包。


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