cellbang / malagu

Malagu is a Serverless First, componentized, platform-independent progressive application framework based on TypeScript. Malagu 是基于 TypeScript 的 Serverless First、组件化、平台无关的渐进式应用框架。
https://malagu.naily.cc
MIT License
696 stars 60 forks source link

已存在的一个类怎么直接生成对象放入容器里?没有类似 @Bean 的注解吗? #208

Closed mlkt closed 1 month ago

mlkt commented 2 months ago

比如已存在一个第三方的类AAA,怎么声明类似 new AAA("123") 后加入到容器里? 必须得定义一个额外的类存在某个字段里?

@Component("BBB")
class BBB {
    aaa = new AAA("123")
}

然后再在依赖方注入这个B?

class CCC {
  @Autowired
  bbb: BBB;

   //或者这样?
  @Value("BBB.aaa")
  aaa: AAA;
}

感觉有点奇怪,没有类似 Spring 的 @Bean 或者定义工厂函数的方式吗?

mlkt commented 2 months ago

刚刚看了下源码,发现好像应该用 @Constant 这个注解

似乎要这样写

@Constant({ id: 'AAA', constantValue: new AAA("123") })
export default class {
}

但名字叫“常量”感觉是声明一个数值或字符串,而且定义在类上面感觉有些迷惑。

我觉得应该搞一个定义在函数上的 @Bean 的注解

class Factory {
   @Bean
   aaa() {
     return new AAA("123")
   }
}

这样明显就清晰多了,也和 Spring 里的一样

muxiangqiu commented 2 months ago

抱歉这么晚才回复。Malagu 框架提供了类似 @Bean 的能力,如下所示:

import { autoBind } from '@malagu/core';
import './index';

export default autoBind(bind => {
    bind('aaa').toDynamicValue(ctx => new AAA());
});

autoBind 方法一般用在一个模块的入口文件中。详细文档可以参阅:https://malagu.naily.cc/components/core/utils#autobind

mlkt commented 1 month ago

好的,感谢