CoffeeScript(Node.js)IoC别名

CoffeeScript(Node.js)IoC别名,node.js,coffeescript,inversion-of-control,alias,service-locator,Node.js,Coffeescript,Inversion Of Control,Alias,Service Locator,这可能有点长,但我遇到了一个轻微的设计障碍 首先,我创建了一个IoC控制反转,包含专门的服务定位器,而不是依赖注入。这也是在node.js上运行的coffee脚本中编写的,并且启用了harmony代理 这个容器很笔直。创建容器对象的新实例并全局或局部存储该变量 Context = require('ettore').Context AppContext = new Context() App = AppContext.create 'App' 在本例中,我还实现了一个管理子上下文的上下文

这可能有点长,但我遇到了一个轻微的设计障碍

首先,我创建了一个IoC控制反转,包含专门的服务定位器,而不是依赖注入。这也是在node.js上运行的coffee脚本中编写的,并且启用了harmony代理

这个容器很笔直。创建容器对象的新实例并全局或局部存储该变量

Context    = require('ettore').Context
AppContext = new Context()
App = AppContext.create 'App'
在本例中,我还实现了一个管理子上下文的上下文对象,不过我可能会去掉它

要在容器中存储信息,请使用以下命令:

App.set 'Namespace.Controller.Action', 'Value goes here'
App.set 'Namespace.Controller.Action.Index', 'Value goes here x2'
这非常有效,解决依赖关系也同样简单,而且还可以使用异步方法

App.resolve 'Namespace.Controller.Action' # 'Value goes here'
App.get 'Namespace.Controller.Action' # 'Value goes here'
这是一个很好的系统,但需要样板代码,并且需要在前面而不是在幕后通过IoC容器。因此,我开始实施一个别名系统,使前面的代码工作如下:

NM = App.alias "Namespace"
NM.Controller.Action # 'Value goes here'
这可以使用V8引擎提供的harmony代理,并可回退到库使用

问题

这个问题很简单,但同时又很复杂,除非我想得太多了。。。。同样,在前面的示例中,我们有两个组件:

Namespace.Controller.Action Namespace.Controller.Action.Index

我的系统在第一个示例中工作得非常完美,如果找到依赖项,就会返回已解决的依赖项。否则,它将发出错误或返回false。问题在于知道是否应该返回依赖项或另一个代理对象,以便它们可以继续下去

为了说明这一点:

系统通过代理逐个对象地执行操作,并返回通常相同的代理对象。这允许您选择长名称空间或命名方案。如果您调用以下语句:

Namespace.Controller.Action

它将通过系统2次。一个用于控制器,另一个用于操作。问题是,您真的不知道当前对象是否附加了其他对象。e、 他们在打电话吗?行动后的索引

现在,我已经实施了一种承诺系统,但这并不是很好。对于当前循环,它将检查完全限定名是否存在依赖项。如果是这样,那么它将添加一个混合方法,该方法在普通代理之外调用

因此,如果您有以下名称空间:

Namespace.Controller.Action
Namespace.Controller.Action.Index
要访问Namespace.Controller.Action组件的内容,必须使用承诺,因为命名中存在冲突

Namespace.Controller.Action.then ->
   @get # 'Value goes here'
Namespace.Controller.Action.Index # 'Value goes here x2'
问题:

有没有更好的方法来解决这个问题?随着时间的推移,我越来越近了,但这一切有时似乎有点令人讨厌

源代码 由于明显的原因,我没有在这里发布完整的源代码,因为它相当长。别名和容器的主代码如下所示:

一个使用相同原理的示例文件发现了别名:

注意:如果你需要我更详细的解释,请告诉我。。。这是一个很奇怪的问题