手机版

typescript nodejs依赖注入实现方法的详细代码说明

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

依赖注入通常就是我们所说的ioc模式。今天,我们分享用typescript语言实现的ioc模式。这里使用的主要组件是reflect-metadata,它可以获取或设置元数据信息。它的功能是获取原始数据后创建对象,类似于C#中的反射。看看第一个代码:

导入“反射元数据”;/* * *对象管理器*/const _ partial container=new mapstring,any();const PARAMTYPE=' design : PARAMTYPE ';//要反映的原始数据有很多选择。我们在这里选择的是获取构造函数的参数类型。对于本地注入器的后续判断/* * *注入全局服务。例如global share */export function inject(): class decorator { return target={ const params 3360 arranyany=reflect . getmetadata(param type,target);if(params)for(const item of params){ if(item===target)抛出新错误('不能自己注入');} _ partialcontainer . set(target . name,target);//加入对象管理器,此时对象还没有创建。}}上面的代码是创建一个类级装饰器,这意味着所有使用这个装饰器的类都将由依赖注入对象管理器管理。这里没有即时的服务创建,因为反射元数据的执行具有最高的机会,并且这种依赖注入支持一些实例对象的手动注入。创建实例的所有工作都被抛在脑后,以防止注射参数未定义。

/* * * }}手动注入实例对象时调用上述方法。我们需要提高这种方法的执行优先级。具体的实例将在后面演示,最重要的部分是创建实例:

导出函数service providert(service : service type T):T { if(_ partialcontainer . has(service . name)!_ Partialcontainer . get(service . name)。name)return _ partialcontainer . get(service . name);//如果已经创建了实例,直接返回Const params 3360 ArrayAny=reflect。getMetadata(参数类型,服务);//获取参数类型const const params=params . map(item={//实例化依赖if(!_ partial container . has(item . name))引发新错误(`$ {item}未注入`);//如果没有注入,则在(item.length)//表示该类型对return serviceProvider(item)有其他依赖关系时抛出异常;//递归继续获取其他依赖if(_ partial container . has(item . name)!_ Partialcontainer . get(item . name)。name)return _ partialcontainer . get(item . name);//如果实例已经创建,则直接返回const obj=new item();//没有其他依赖关系。开始创建instance _ partialcontainer.set(项。名称,obj);//替换未在对象管理器中实例化的对象return obj});const obj=新服务(.constraparams);//这意味着对象尚未创建。开始创建object _ partial container . set(service . name,obj)。//替换未在对象管理器中实例化的对象return obj}上面的代码有点复杂,其他的也不难理解。通俗地说,如果您已经实例化了直接返回实例,那么您将启动对象并创建所有依赖项。以下是一个例子:

从""导入{服务提供商,添加服务全球,注入} ./岩心/注射液/注射器;导入"反射元数据";import moment=require(' moment ');@Inject()导出类ServiceA{ property? string msg(){ return ' ServiCea ';}}@Inject()导出类ServiceC {构造函数(私人服务: ServiCea)} { }打印(){控制台。日志(这个。服务。财产);"返回"调用了我;} } @ Ing()导出类ServiceD{ print(){ console.log('我在测试注入');}}@Inject()导出类GlobalService {构造函数(私人服务: ServiCec){ } msg!字符串;print(){控制台。日志(` 0共享模块$ {这个。服务。print()} `)} @ Inject()导出类Init {构造函数(private service: ServiceA,private serviceD: ServiceD,private global : global service,private date: Date,private strList: string[],private serviceC: ServiceC,} { } start(){ console。日志(这个。服务。msg());this.service.property='A '模块设置的共享数据控制台日志(时刻(这个.日期).格式(' YYYY-MM-DD ')控制台。日志(这个。strlist);这个。ServiCe。print();这个。服务c。print();这个。全球。print();}} const obj=新日期(' 2017-1-1 ');const str=['吕顺彬','菜鸟','豆豆','大铁,' CC哥','码农之家的一群人'];addServiceInGlobal(obj,str);//添加手动创建的实例对象到对象管理器const ServiCe=ServiCe Provider(Init);//开始创建实例service.start()//执行上面的实例中得到一下执行结果:

总结:上面我用的是默认全局注入,没有做单线态(单例) ,如果要做的话稍微修改下代码就可以实现,这里边的难点可能是基于反射的设计方法,如果前端思维可能理解起来稍微困难点,后台的话稍微好点。

总结

以上所述是小编给大家介绍的typescript nodejs依赖注入实现方法代码详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

版权声明:typescript nodejs依赖注入实现方法的详细代码说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。