【问题标题】:Why does HotTowel include Breeze?为什么 HotTowel 包含微风?
【发布时间】:2013-02-09 09:56:37
【问题描述】:

从表面上看,这听起来像是一个愚蠢的问题,但为什么 Hot Towel SPA Template 包含 Breeze 呢?

过去几天我一直在学习 Hot Towel 及其依赖项,据我所知,模板中没有任何内容实际使用 Breeze。也许未来的版本会改变这种情况?

当然,Breeze 是一个很好的库。但它受 CRUD 方法的约束,需要您以特定的方式设计 ApiController。 (元数据、SaveChanges 等)see here

它还引导您使用实体框架。虽然这更像是一种软依赖,但由于 Breeze 还显示了 a sample without it,它仍然会引导您使用修改后的存储库模式实现类似的模式。

如果您使用的是 NoSQL 数据存储或 CQRS 模式而不是 CRUD,那么 Breeze 将变得非常难以使用。有一些用于数据访问的替代库在这种风格下运行良好,例如 AmplifyJS

但是热毛巾的其余部分都很棒!我特别喜欢杜兰达尔。那么问题来了,如果模板实际上没有进行任何数据访问——为什么要包含任何数据访问组件呢?最好在没有 Breeze 的情况下发布它,如果最终用户想要使用 Breeze、Amplify 或其他任何东西 - 那就这样吧。 Hot Towel 的其余部分将继续作为出色的 SPA 实施而大放异彩。

【问题讨论】:

    标签: breeze hottowel


    【解决方案1】:

    马特 - 好问题。既然我创建了它,我想我应该回答:)

    当我构建模板时,我的重点是提供足够的资源让人们使用正确的工具,并提供足够的入门代码来指导方向。我不希望任何人撕掉代码。我不喜欢那些让你走上一条道路并让你删除大量文件和代码并改变方向的模板。这些是样本。

    样品很好。事实上,样本可以非常出色(就像其他模板一样,我觉得更像样本)。这些还有另一个目的:展示你如何做事。

    回到 Hot Towel 模板...如果我包含使用 Breeze 的代码,我会很想在客户端上添加一个 datacontext.js 和一个 model.js。它们将包含数据访问代码和扩展客户端模型的代码。然后我会很想添加一个控制器、一些服务器端模型、一个 ORM 和一个数据库。到达那里后,我想在多个屏幕中使用数据,这导致我使用 Breeze 进行更多的 Knockout 和缓存。然后我可能会想添加编辑,这将导致更改跟踪。很快我就有了一个完整的应用程序。或者更保守一点,我又拿了一个样本。虽然这些方法会为如何将它们组合在一起提供更多指导,但它们不会帮助您“开始”使用模板,您可以在其中开始构建和添加自己的代码。如果我缺少其中一些功能,那么它仍然在走一条需要你改变我的做法的道路。

    就目前而言,HotTowel 非常接近真正意义上的模板。您创建了一个新项目,然后开始添加自己的代码。

    您可以争论(并且您可能会争论)Breeze 不应该在其中,因为我没有在模板中使用它。我也不使用moment.js,顺便说一句。但是,我认为它们都是优秀的库,没有它们我不想构建基于 CRUD 的 SPA。正如您所建议的,Breeze 很灵活,因此您不必走特定的路径。

    了解 Breeze 价值的最佳方式是构建一个具有其功能但没有 Breeze 的应用。然后您可以看到需要多少代码以及它的参与程度。例如,请参阅我在 Pluralsight 的中级 SPA 课程,我就是这样做的:http://jpapa.me/spaps

    所以你问“为什么是微风?” ...因为我强烈推荐它用于构建 SPA。

    感谢您的提问,祝您好运!

    【讨论】:

    • 作为旁注...放大,虽然很棒,但与 Breeze 的效果不一样。
    • 感谢您的详细解答。我想我使用 Hot Towel 更像是一个示例启动器,而不是一个模板。我看到你的观点。对我来说,Breeze 会妨碍我,因为我已经有一个丰富的 WebAPI 可以连接。对于其他人来说,也许它更好。你在连接 Durandal 方面做得很好,热毛巾壳非常脆。更换我不想要的零件对我来说相当容易,所以一切都很好。说真的 - 它为我省去了很多麻烦。谢谢!!!
    • 很高兴它很有帮助。我正在考虑创建一个更像示例的模板。如果它有帮助并且有足够的兴趣,我会这样做。
    • @JohnPapa 我当然会感兴趣。我刚刚开始使用 asp.net,并且玩过很多次 Hot Towel(我有一些 C# 经验,但对 Java 有一些帮助)并且发现它非常有用。但是,如果在参考数据时看到一些使用热毛巾的不同方式,那就太好了。我见过的唯一方法是使用微风,使用它我一直遇到 OData not found 错误。我当然希望看到的一件事是使用自动生成的 MVC 控制器,其视图与热毛巾的 MVVM 模型一起工作。
    • @John Papa,我推动我的团队将 BreezeJS 用于 WebAPI + OData 后端,我对这个决定感到非常难过。 Breeze 中对 OData 的支持不是您想要的。不完全是团队的错,但是没有足够的文档来阻止你一开始就使用它。我们发现 EDM 模型的所有解决方法都不完整。当他的 EDM 没有得到完全支持并且作为 Breeze 的初学者的团队难以轻松使用它时,就缺乏对扩展子句的支持。第 1/2 部分
    【解决方案2】:

    感谢您提出问题。

    作为 HT 的作者,John 提供了一个答案。作为 Breeze 项目的负责人,我倾向于同意他的观点:)

    HotTowel 为您打下基础。它不是建筑物本身。

    它是针对特定类型应用程序的基础,即基于一组特定协作 JavaScript 和 ASP.NET 技术的 CRUD 应用程序。 Breeze 是贡献者……但不是唯一的贡献者。 Knockout 具有 MVVM 设计和 2 路数据绑定,特别适合 CRUD 应用程序典型的数据输入任务。

    当然还有其他种类的 SPA。有一类重要的应用程序主要呈现信息并接受很少的用户输入。这样的应用程序并不能从数据绑定中获得太多好处,而且编写它们的人通常会对数据绑定特别是 KO 怀有敌意。

    我的观点是,HT 针对特定类别的应用程序......至少以持续流行度来衡量,这种应用程序恰好非常成功。它为构建这些应用程序的人提供商品。它可能不是其他类型应用的正确起点。

    确实,通往 Breeze 的捷径贯穿于 Web API、EF 和关系数据库。拿走这些,您可能会在服务器上编写更多代码(在客户端上编写更多代码)。这可能是您的完美权衡。

    Breeze 的作者希望使这条路径更容易。 我不认为 BreezeJS 让它变得更难。我不明白您的说法“Breeze 变得非常难以使用。”你试过了吗?

    您的客户端可以以您选择的任何方式与任何 HTTP 资源进行通信。使用现有的 Web API 控制器非常容易(尽管使用 Breeze Web API 控制器更容易)。如果您愿意,可以使用 amplify.js(顺便说一句,您可以告诉 Breeze 使用 amplify 进行 AJAX 调用)。如果您不想,您甚至不必使用 Breeze EntityManager 来查询和保存数据。

    BreezeJS 的其余部分可能对您仍然有价值。在您弄清楚如何检索和存储数据以及您更喜欢 Entity-ChangeSet 样式还是 Command/Query 样式之后,还有很多工作要做。

    你必须找到这些问题的答案:

    • 如何将原始 JSON 数据转换为可绑定对象?
    • 您将如何保留这些对象并在多个屏幕上共享它们,而不需要对服务器进行冗余往返?
    • 在将地址绑定到 StatesAndProvinces 组合框时,您将如何从一个对象导航到相关对象?
    • 您将如何跟踪更改?
    • 您将如何验证它们?
    • 当应用程序“墓碑”时,您将如何将部分或全部数据存储在本地存储中?

    即使您不希望它为您查询和保存,Breeze 也可以帮助您完成这些琐事。

    如果你的回答仍然是“我会自己做所有这些,谢谢”......好吧,从你的 HotTowel 项目中删除 Breeze 就像这样简单:

    Uninstall-Package breeze.webapi

    【讨论】:

    • 我希望看到 Breeze 示例与一些现有的 Web API 控制器相结合……也许 Matt 和 Ward 可以一起看看。看看结果会很有趣。
    • 感谢您的观点。是的 - 我已经尝试过轻风,我同意它对于特定类型的应用程序具有巨大的价值。客户端库很棒。我有问题的部分都在服务器端。 IQueryable 和 OData 很棒,但 SaveChanges()MetaData() 对我来说太专有了。我仍然会尝试adapt the NoDb sample for RavenDB,但表面上感觉有点限制。我希望证明自己错了。 :)
    • 另一点 - 我希望能够使用相同的 WebAPI 端点来构建我自己的应用程序,并为我的客户提供开发人员 SDK 以连接到我的后端服务器。我的应用程序不应该有任何特殊的访问权限,我不想强​​迫其他人使用微风。他们可能完全在其他平台上。也许有一些我没有想到的调和模式?
    • 我听到你的声音响亮而清晰。请继续您自己的调查,而我会在内部对这些问题进行一些关注。我知道你并不孤单。
    • 只是为了增加我的几分钱。我最近问了一个这样的问题......我指出 SavesChanges 方法虽然让生活变得超级简单,但在某种程度上是专有的。我同意 MetaData 也是这种方式。更新 2 和 webapi odata 支持已经改变了很多事情。你们应该认真考虑 ContextProvider 之类的样板代码,它更适合 webapi odata IMO。我希望看到像 EntitySetController 这样的单个 Put/Post/Delete 方法为...提供了一个抽象框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2011-12-22
    • 2013-04-03
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多