我正在尝试使用 Harmony Proxies (Node.js) 用 JavaScript 编写动态服务定位器。基本上你会创建一个新容器:
var container = new Container();
然后,您将能够像传统的服务定位器一样设置和获取值:
container.set('FM', {});
container.get('FM');
container.get('FM', function(FM) {
});
你甚至可以拥有像子对象一样的命名空间:
container.set('FM.Object', {});
问题在于动态别名。
var App = container.alias('App');
创建别名时,它会创建一个新的代理对象,您可以在其中像传统对象一样操作它,但它是get()
和set()
方法的别名。
代替:
container.get('App.Hello');
使用别名,您将使用:
App.Hello
问题在于深层命名空间。假设您正在尝试访问App.Hello.World.Controller
,因为它一次通过代理一个名称空间,而不是一次全部(就像那个完整的名称空间)。我如何知道用户是否正在调用App.Hello
以检索存储在服务定位器中的值,或者用户是否想继续访问更深的命名空间?你不能(根据我的尝试)。
你还有什么其他方法可以做到这一点?
App.Hello.World
如果要访问更深的名称空间,则具有将返回代理或存储在服务定位器中的值的语法。
var App = container.alias('App');
App.Controller.Home.Method.Index
// It would go through:
App -> Proxy
App.Controller -> Proxy or Value?
App.Controller.Home -> Proxy or Value?
App.Controller.Home.Method -> Proxy or Value?
App.Controller.Home.Method.Index -> Proxy or Value?
现在,我已经制定了处理这两个选项的约定。您将使用单数名称来检索值和复数来返回代理。这只是一个快速的“破解”,因为它不是很有效。
(如果您需要澄清或更多信息,请告诉我)