Javascript 在同一MVC项目中的C#类和JS文件中使用相同的静态数据,而无需在运行时反复重建 问题
我的问题(就我所能说的一般而言)是: *对于需要在MVC站点的c#中以及某些JavaScript中使用的几个文件,以一系列配置字符串的形式提供一些静态数据(很少更改,需要重新编译站点),如URI、哈希等。 *我们不想复制数据,因为它肯定会失去同步,并导致我们难以追踪各种错误。 *理想情况下,我们希望创建JS文件,并在构建时将数据插入其中,直接从存储在其中的c#类中获取数据,这样就不会在每次请求重新构建JS时浪费大量时间,而且c#类是否需要在JS文件中挖掘数据来提取数据 到目前为止的研究和可能的解决方案 T4文本模板 我们考虑使用T4(.tt Text Template)来构建JS,但我们刚刚遇到T4,还没有找到一种方法(如果存在的话)来访问T4文件中现有的项目类来生成JS 使用类似于吞咽的东西 我们也可以使用Gulp并在JS中构建一些东西来直接从类文件中提取数据来构建JS,但到目前为止,我们一直使用NuGet,一些VS扩展和我们的TFS部署服务器,并不想增加Gulp和ether将所有内容切换回它或在Gulp和MSBuild/TFS之间拆分构建的复杂性。我们对此有一点经验,并发现它给我们带来了更多的问题,使其无法正常运行 在运行时生成并缓存JS文件 如前所述,我们还可以创建一个页面,在运行时构建并返回JS。我们可以在第一次构建之后缓存输出,因为它不会改变,但这仍然会影响我的MVC,而不仅仅是一个文件,缓存的数据需要存储和检索Javascript 在同一MVC项目中的C#类和JS文件中使用相同的静态数据,而无需在运行时反复重建 问题,javascript,c#,asp.net-mvc,visual-studio,Javascript,C#,Asp.net Mvc,Visual Studio,我的问题(就我所能说的一般而言)是: *对于需要在MVC站点的c#中以及某些JavaScript中使用的几个文件,以一系列配置字符串的形式提供一些静态数据(很少更改,需要重新编译站点),如URI、哈希等。 *我们不想复制数据,因为它肯定会失去同步,并导致我们难以追踪各种错误。 *理想情况下,我们希望创建JS文件,并在构建时将数据插入其中,直接从存储在其中的c#类中获取数据,这样就不会在每次请求重新构建JS时浪费大量时间,而且c#类是否需要在JS文件中挖掘数据来提取数据 到目前为止的研究和可能的解
最后一种方法(运行时构建和缓存JS文件)是我倾向的方法,因为它是未来新开发人员最干净、最容易遵循的方法,并且不需要向项目中添加任何额外的包/库。同时构建和缓存
。运行时构建和缓存JS
文件当然是一种选择,这将浪费web服务器上的少量RAM和CPU周期。更不用说,缓存可能会在调试期间造成混乱
在国际海事组织,更好的选择是
.js
和.cs
文件.csproj
文件中.js
文件可以作为静态文件部署到服务器。为了避免混淆,T4模板可以包括一个警告,在开发过程中不要修改输出文件
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//
//这段代码是由一个工具生成的。
//
//对此文件的更改可能会导致不正确的行为,如果
//重新生成代码。
//
//------------------------------------------------------------------------------
当然,如果您不熟悉T4技术,并且不希望项目中有任何额外的.tt
文件可能会让新开发人员感到困惑,那么您可以使用定制的控制台应用程序替换T4,该应用程序从JSON或XML读取源数据。但是您应该考虑.cs
和.js
文件在开发过程中的更改频率-T4不必编译成工具才能使用它
Gulp也是一个选项,但不值得将其添加到构建管道中,因为这样的小事。如果您已经在应用程序或构建中使用GULP,请只考虑它。
但是,无论你如何划分它,这听起来比运行时发生的事情更适合构建步骤。我们最终采用的解决方案是在网站首次运行时,通过在
应用程序\u Start()
(调用/或Global.asax
)中添加如下调用来运行创建代码:
protected void Application_Start()
{
...
// Generates (replacing if required) all the static files that require dynamically creating
DynamicFileConfig.GenerateStaticFiles();
}
这允许应用程序/网站启动并运行,并允许我们访问该项目的所有类,而无需拆分它们或添加任何复杂的库
它也不需要额外的构建步骤或任何额外的维护,在我们的情况下,处理时间是在发布过程中完成的(因为我们的发布系统测试站点启动应用程序启动()
启动的代码只是一个带有静态函数的小静态类,用于生成文件(它不存储在我们的repo中),或者如果已经创建了文件,则进行替换。什么形式的“静态数据”?嵌入式资源?资源文件?其他?我会将所有静态数据放在一个json文件中,然后用C#和JS获取该文件,这样您就可以共享该文件,而无需实际桥接C#/JS边界。由于它是静态数据,同步不应该是一个问题。我不建议使用tt文件,但当您让它们正常工作时,它们非常好。要访问类,可以使用反射,而不是解析类文件。实际上,我建议您使用友好的GUI编写自己的代码生成器。这就是我目前正在做的,使用XSD文件进行消息传递和数据库创建,而且它“非常有效”(一旦您完成了所有艰苦的工作:p)@NightOwl888我在问题中添加了更多的静态数据详细信息。@Shilly虽然JS可以在构建时与JSON捆绑在一起创建一个文件用于快速下载,但cs将需要再次访问该文件,即使只是