Javascript 在同一MVC项目中的C#类和JS文件中使用相同的静态数据,而无需在运行时反复重建 问题

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文件中挖掘数据来提取数据 到目前为止的研究和可能的解

我的问题(就我所能说的一般而言)是: *对于需要在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,而不仅仅是一个文件,缓存的数据需要存储和检索


最后一种方法(运行时构建和缓存JS文件)是我倾向的方法,因为它是未来新开发人员最干净、最容易遵循的方法,并且不需要向项目中添加任何额外的包/库。

同时构建和缓存
。运行时构建和缓存JS
文件当然是一种选择,这将浪费web服务器上的少量RAM和CPU周期。更不用说,缓存可能会在调试期间造成混乱

在国际海事组织,更好的选择是

  • 将静态数据转换为常见的文件格式,如JSON或XML
  • 使用T4模板读取通用格式并构建
    .js
    .cs
    文件
  • 创建一个批处理文件以运行T4转换,并将其作为添加到
    .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将需要再次访问该文件,即使只是