CoffeeScript(Node.js)IoC别名
这可能有点长,但我遇到了一个轻微的设计障碍 首先,我创建了一个IoC控制反转,包含专门的服务定位器,而不是依赖注入。这也是在node.js上运行的coffee脚本中编写的,并且启用了harmony代理 这个容器很笔直。创建容器对象的新实例并全局或局部存储该变量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' 在本例中,我还实现了一个管理子上下文的上下文
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'
问题:
有没有更好的方法来解决这个问题?随着时间的推移,我越来越近了,但这一切有时似乎有点令人讨厌
源代码
由于明显的原因,我没有在这里发布完整的源代码,因为它相当长。别名和容器的主代码如下所示:
一个使用相同原理的示例文件发现了别名:
注意:如果你需要我更详细的解释,请告诉我。。。这是一个很奇怪的问题