uioc icon indicating copy to clipboard operation
uioc copied to clipboard

能否对一个已经存在的对象做注入

Open otakustay opened this issue 10 years ago • 10 comments

一个对象不是ioc创建出来的,但需要注入其属性

麻烦在于,不知道对应的module id,没有ioc里的config id,也不知道类名,毕竟js没有元数据

otakustay avatar Aug 18 '14 08:08 otakustay

是想像下面这样?

var obj = ioc.injectDeps(obj);
// 啪啪啪,obj 的属性依赖都进来了

这个有什么使用场景么?

可能的实现方式是,按照自动注入的方式找 setter 依赖,或者再来个参数,里面是需要注入的依赖

Exodia avatar Aug 19 '14 04:08 Exodia

场景是,下一代的ESUI我规划可以和IoC接入

比如我们的ActionPanel,它会依赖一个Controller实例来加载Action,但是就现在来说,只能使用默认的那个实例(就是er/controller模块),这不是一个合理的设计,因为用户可能定制自己的Controller实例在那用

因此我希望在创建了ActionPanel之后,可以经过IoC把它管理的Controller实例注入进去

另一种方法是所有控件都让IoC创建,这是一个方法但直观感觉会遇上不少的问题不见得容易实现

otakustay avatar Aug 19 '14 04:08 otakustay

能否说下,大概想怎么用 ioc 对对象注入?如果 ActionPanel 提供 controller 的配置及setter,似乎可以直接从 ioc 拿 controller 就好,或者在依赖配置中配置 view 的UIProperties

Exodia avatar Aug 19 '14 08:08 Exodia

  1. 我不想让ActionPanel知道IoC所以不能控件直接找IoC要东西
  2. 除了ActionPanel,也有别的控件需要别的在IoC中的东西,而哪些IoC中有可以拿,哪些没有,这个事ESUI或者业务系统写的UIParser(对应现在的esui/main的东西)都不应该知道

所以我的想法是,有一个特殊的UIParser,会在每一个控件创建出来以后(某个事件),去IoC中加工一遍,然后再往上加uiProperties等信息,再返回,而加工一遍里做了什么,这个让UIParser的子类来实现或者在IoC中实现理论上都可以,IoC来做的话应用面会更广

otakustay avatar Aug 19 '14 09:08 otakustay

根据2的需求,IoC 提供一个生命周期:onCreate:handler,这样在 handler 做这些事情如何?

Exodia avatar Aug 19 '14 09:08 Exodia

不知道这是不是叫拦截器的意思。。- -!!每个实例创建后,都会调用 onCreate,在这里面业务项目自己去搞?

Exodia avatar Aug 19 '14 09:08 Exodia

我的想法是:

// UIParser.js
var control = createControlFromElement(currentElement);
ioc.inject(control);
control.render();

这样control里所有IoC能注入的属性都会完成注入

otakustay avatar Aug 19 '14 09:08 otakustay

按照这种方式:ioc.inject肯定是异步的了,另外仅提供对象的话,只能去找 setter 自动注入,可以增加一个数组,里面配置要注入的依赖:

ioc.inject(control, function(){
     control.render();
});

ioc.inject(control, ['dep1', 'dep2'], function(){
     control.render();
});

Exodia avatar Aug 19 '14 09:08 Exodia

以后ESUI的init肯定是异步的这个没问题,在真正生产环境上这里的异步一般不会有网络开销

那如果可以提供一个config id的话,注入应该就很容易做了吧?

otakustay avatar Aug 20 '14 10:08 otakustay

能提供 config id的话,是可以完全实现注入的。

Exodia avatar Aug 20 '14 14:08 Exodia