依赖注入与托管依赖关系与全局对象

2024-04-23

我正在 Javascript + BackboneJS (一个 MVC 框架)+ RequireJS 框架中工作,但这个问题有点 OO 通用。

首先让我解释一下,在 Backbone 中,您的视图是传统视图和控制器的混合,而您的 HTML 模板是传统的 MVC 视图

我已经为此绞尽脑汁有一段时间了,我不确定正确/务实的方法应该是什么。

我有一个 User 对象,其中包含许多代码所依赖的用户首选项(例如单位系统、语言选择等)。

我的一些视图在不使用模板的情况下完成大部分工作(通过使用第三方库,例如映射和图形库),因此它们依赖于用户对象来处理单位转换等问题。我目前正在使用 RequireJS 来管理该依赖关系,而不会过多破坏封装。

我的一些视图本身只做很少的工作,只将模型数据传递给我的模板引擎/模板,它们完成工作并且确实依赖于用户对象,同样,对于单位转换之类的事情。将此依赖项传递到模板的唯一方法是将其注入到模型中,并将模型传递到模板引擎中。

我的问题是,如何最好地处理这种广泛需要的依赖关系? - 创建一个可随处访问的应用程序范围的引用/全局对象? (YUK) - 使用 RequireJS 托管依赖项,尽管通常只建议对类/对象定义而不是具体对象使用托管依赖项加载。 - 或者,只使用依赖项注入,并手动将该依赖项传递到需要它的所有内容中?


从纯粹的技术角度来看,我认为可交换全局变量(可能会改变的全局变量),尤其是在 javascript 中,是危险且错误的。特别是因为 javascript 充满了异步执行的代码部分。考虑以下代码:

window.loggedinuser = Users.get("Paul");
addSomeStuffToLoggedinUser();
window.loggedinuser = Users.get("Sam");
doSomeOtherStuffToLoggedinUser();

Now if addSomeStuffToLoggedinUser()在某处异步执行(例如,它执行 ajax 调用,然后在第一个 ajax 调用完成时执行另一个 ajax 调用),当它到达第二个 ajax 调用时,它很可能正在向新登录用户(“Sam”)添加内容。显然不是你想要的。

话虽如此,我更不支持拥有一些我们一直从一个函数传递到另一个函数的用户对象,无休无止。

就我个人而言,必须在这两种邪恶之间做出选择,我会选择“很少改变”的事物的全球范围——除非我正在建造核电站或其他东西。因此,我倾向于让登录的用户在我的应用程序中全局可用,冒着这样的风险:如果由于某种原因某些调用运行得很晚,并且我遇到了一种情况,一个用户注销而另一个用户直接登录,某些情况奇怪的事情可能会发生。 (话又说回来,如果流星撞入托管我的应用程序的数据中心,也可能会发生奇怪的事情......我也没有防范这种情况)。实际上,一个可能的解决方案是在有人注销后立即重新加载整个应用程序。

所以,我想这一切都取决于你的应用程序。让它变得更好的一件事(并且让你感觉你仍然获得了一些 OO karma 点)是将你的数据隐藏在一些命名空间的单例中:

var myuser = MyApp.domain.LoggedinDomain.getLoggedinUser();
doSomethingCoolWith(myuser);

代替

doSomethingCoolWith(window.loggedinuser);

虽然最后几乎是一样的事情......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖注入与托管依赖关系与全局对象 的相关文章

随机推荐