是否可以使用MVC项目制作单独的dll?

时间:2015-11-03 21:41:48

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

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

此模块还共享最多javascripts,css文件和其他文件。这就是我们不想分开MVC项目的原因。

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

5 个答案:

答案 0 :(得分: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文件,它将反映在两个项目中。

有关详细信息,请阅读以下内容:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我不知道你是否尝试过使用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

答案 3 :(得分:0)

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

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

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

选项2 - 每个模块创建类库,构建后 merge

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

现在,所有模块都将作为单独的项目构建,包含dll文件和javasvript s,html s,css s,图片等。它们都可以作为单个web application工作,您可以创建一个(仅一个)MVC Web项目,该项目将转到IIS虚拟目录并将作为Web发布。

要使用来自同一网站的所有单独模块,您可以在所有这些库中编写post build个事件,以将工件(dll,脚本等)复制到主Web中,并将其复制到相应的文件夹中(dll到\ bin,javascript to \ 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中删除特定模块,只需从该模块(项目)中删除post build事件,而不会影响其他任何事件。你可以随时添加它。

您的整体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

答案 4 :(得分:0)

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

  

此模块还共享最多javascripts,css文件和其他文件

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

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

为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项目的包。

相关问题