能否对一个已经存在的对象做注入
一个对象不是ioc创建出来的,但需要注入其属性
麻烦在于,不知道对应的module id,没有ioc里的config id,也不知道类名,毕竟js没有元数据
是想像下面这样?
var obj = ioc.injectDeps(obj);
// 啪啪啪,obj 的属性依赖都进来了
这个有什么使用场景么?
可能的实现方式是,按照自动注入的方式找 setter 依赖,或者再来个参数,里面是需要注入的依赖
场景是,下一代的ESUI我规划可以和IoC接入
比如我们的ActionPanel,它会依赖一个Controller实例来加载Action,但是就现在来说,只能使用默认的那个实例(就是er/controller模块),这不是一个合理的设计,因为用户可能定制自己的Controller实例在那用
因此我希望在创建了ActionPanel之后,可以经过IoC把它管理的Controller实例注入进去
另一种方法是所有控件都让IoC创建,这是一个方法但直观感觉会遇上不少的问题不见得容易实现
能否说下,大概想怎么用 ioc 对对象注入?如果 ActionPanel 提供 controller 的配置及setter,似乎可以直接从 ioc 拿 controller 就好,或者在依赖配置中配置 view 的UIProperties
- 我不想让
ActionPanel知道IoC所以不能控件直接找IoC要东西 - 除了
ActionPanel,也有别的控件需要别的在IoC中的东西,而哪些IoC中有可以拿,哪些没有,这个事ESUI或者业务系统写的UIParser(对应现在的esui/main的东西)都不应该知道
所以我的想法是,有一个特殊的UIParser,会在每一个控件创建出来以后(某个事件),去IoC中加工一遍,然后再往上加uiProperties等信息,再返回,而加工一遍里做了什么,这个让UIParser的子类来实现或者在IoC中实现理论上都可以,IoC来做的话应用面会更广
根据2的需求,IoC 提供一个生命周期:onCreate:handler,这样在 handler 做这些事情如何?
不知道这是不是叫拦截器的意思。。- -!!每个实例创建后,都会调用 onCreate,在这里面业务项目自己去搞?
我的想法是:
// UIParser.js
var control = createControlFromElement(currentElement);
ioc.inject(control);
control.render();
这样control里所有IoC能注入的属性都会完成注入
按照这种方式:ioc.inject肯定是异步的了,另外仅提供对象的话,只能去找 setter 自动注入,可以增加一个数组,里面配置要注入的依赖:
ioc.inject(control, function(){
control.render();
});
ioc.inject(control, ['dep1', 'dep2'], function(){
control.render();
});
以后ESUI的init肯定是异步的这个没问题,在真正生产环境上这里的异步一般不会有网络开销
那如果可以提供一个config id的话,注入应该就很容易做了吧?
能提供 config id的话,是可以完全实现注入的。