我们在Asp.net MVC5中开发了一个大项目。我们的模型和业务逻辑在单独的类库中定义。现在我们需要向现有项目添加另一个模块,但我们需要一个单独的dll。
此模块还共享最多javascripts,css文件和其他文件。这就是我们不想分开MVC项目的原因。
为什么我们可以为模块创建单独的dll。所以我们不想部署或触摸其他dll。
答案 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项目的包。