当前位置: 首页 > news >正文

wordpress 视频站主题注册有限公司的流程和条件

wordpress 视频站主题,注册有限公司的流程和条件,找美工做网站多少钱,胶东网站建设文章目录 前言依赖注入是什么依赖注入的好处是什么结构图应用程序上下文接口上下文管理器暴露的功能使用示例最后 前言 你好#xff0c;我是醉墨居士#xff0c;欢迎来到我的博客#xff0c;今天带领大伙使用Go语言实现依赖自动注入#xff0c;我们不会使用其它的第三方库… 文章目录 前言依赖注入是什么依赖注入的好处是什么结构图应用程序上下文接口上下文管理器暴露的功能使用示例最后 前言 你好我是醉墨居士欢迎来到我的博客今天带领大伙使用Go语言实现依赖自动注入我们不会使用其它的第三方库项目核心代码不到100行是Go语言初学者难得的精简项目 依赖注入是什么 依赖注入Dependency Injection简称DI是一种设计模式用于实现控制反转Inversion of Control简称IoC原则。它的核心思想是将对象的依赖关系从内部管理转移到外部管理从而降低对象之间的耦合度提高代码的灵活性和可测试性 依赖注入的好处是什么 降低耦合度通过将依赖关系从对象内部转移到外部可以降低对象之间的耦合度。这样对象只需要知道它需要什么而不需要知道如何获取这些依赖 提高可测试性依赖注入使得单元测试变得更加容易。在测试时可以轻松地替换掉真实的依赖对象使用模拟对象Mock Object或存根Stub来进行测试从而隔离被测试代码 增强可维护性由于依赖关系被明确地定义和管理代码的可读性和可维护性得到了提高。当需要修改依赖关系时只需要在配置或注入点进行修改而不需要修改对象内部的代码 促进代码重用依赖注入使得组件可以更容易地在不同的上下文中重用。因为组件不直接创建和管理自己的依赖所以它们可以在不同的环境中被配置和使用 支持面向接口编程依赖注入鼓励使用接口来定义依赖关系而不是具体的实现类。这使得代码更加灵活因为可以在运行时替换不同的实现而不需要修改调用代码 简化对象创建依赖注入容器如Spring的ApplicationContext可以自动管理对象的创建和生命周期开发者不需要手动创建和管理这些对象从而简化了代码 结构图 现在介绍一下我们依赖注入这个小项目的结构图 应用程序上下文接口 type BeanProvider func() reflect.Valuetype ApplicationContext interface {Inject(provider BeanProvider, name string) errorAutowise(obj any, name string) error }上下文管理器 type context struct {namedConatiner map[string]BeanProvidertypedContainer map[reflect.Type]BeanProvider }// 实现依赖注入 func (c *context) Inject(provider BeanProvider, name string) error {if provider nil {return fmt.Errorf(inject: provider can not be nil)}if name {// type injectty : provider().Type()if _, ok : c.typedContainer[ty];ok {return fmt.Errorf(inject: %v is ambiguous, ty)}c.typedContainer[ty] provider} else {// name injectif _, ok : c.namedConatiner[name];ok {return fmt.Errorf(inject: %v is ambiguous, name)}c.namedConatiner[name] provider}return nil }// 实现自动装配 func (c *context) Autowise(val any, name string) error {if val nil {return fmt.Errorf(inject: nil value)}rv : reflect.ValueOf(val)if rv.Kind() ! reflect.Ptr {return fmt.Errorf(inject: %v is not a pointer, rv)}ri : reflect.Indirect(rv)rt : ri.Type()var provider BeanProviderif name {// type autowiseprovider c.typedContainer[rt]} else {// name autowiseprovider c.namedConatiner[name]}if provider nil {return fmt.Errorf(inject: %v is not found, name)}obj : provider()if obj.CanConvert(rt) {ri.Set(obj.Convert(rt))return nil}return fmt.Errorf(inject: value can not convert to %s, ri.Type()) }暴露的功能 func defaultBeanProvider(v any) BeanProvider {return func() reflect.Value {return reflect.ValueOf(v)} }// 对外暴露依赖注入的能力name为空字符串时表示默认使用类型注入 func Inject(obj any, name string) error {return instance.Inject(defaultBeanProvider(obj), name) }// 对外暴露依赖注入的能力name为空字符串时表示默认使用类型注入 func DeepInject(provider BeanProvider, name string) error {return instance.Inject(provider, name) }// 对外暴露自动装配的能力name为空字符串时表示默认使用类型自动装配 func Autowise[T any](obj *T, name string) error {return instance.Autowise(obj, name) }使用示例 示例代码 package mainimport (fmtgithub.com/zm50/injectorreflect )type TwoString struct {s1 *strings2 *string }func main() {// 通过类型注入变量注入一个string类型的变量var injectString string 醉墨居士err : injector.Inject(injectString, )if err ! nil {panic(err)}// 通过类型装配变量通过string类型自动装配变量var autowiseString stringerr injector.Autowise(autowiseString, )if err ! nil {panic(err)}fmt.Println(类型注入和装配的演示结果)fmt.Println(注入的变量, injectString, 装配的变量, autowiseString)// 通过名称注入变量var injectName string 醉墨var injectString2 string 居士err injector.Inject(injectString2, injectName)if err ! nil {panic(err)}// 通过名称装配变量var autowiseString2 stringerr injector.Autowise(autowiseString2, 醉墨)if err ! nil {panic(err)}fmt.Println(名称注入和装配的演示结果)fmt.Println(注入的变量, injectString2, 装配的变量, autowiseString2)// 通过类型注入结构体指针injectStruct : TwoString{}injectStruct.s1 new(string)injectStruct.s2 new(string)*injectStruct.s1 醉墨*injectStruct.s2 居士err injector.Inject(injectStruct, )if err ! nil {panic(err)}// 通过类型装配结构体指针autowiseStruct : TwoString{}err injector.Autowise(autowiseStruct, )if err ! nil {panic(err)}fmt.Println(结构体指针注入和装配的演示结果)fmt.Println(注入的变量, injectStruct, *(injectStruct.s1), *(injectStruct.s2))fmt.Println(装配的变量, autowiseStruct, *(autowiseStruct.s1), *(autowiseStruct.s2))fmt.Println(是否相等, injectStruct autowiseStruct, injectStruct.s1 autowiseStruct.s1, injectStruct.s2 autowiseStruct.s2)// 自定义依赖注入和装配的能力演示自定义依赖注入和装配的能力实现深拷贝大家可以也根据自己的需求自定义依赖注入和装配的能力injectStruct2 : TwoString{s1: new(string), s2: new(string),}*(injectStruct2.s1) 醉墨*(injectStruct2.s2) 居士provider : func() reflect.Value {twoString : TwoString{}twoString.s1 new(string)twoString.s2 new(string)*twoString.s1 *injectStruct.s1*twoString.s2 *injectStruct.s2return reflect.ValueOf(twoString)}err injector.DeepInject(provider, )if err ! nil {panic(err)}autowiseStruct2 : TwoString{}err injector.Autowise(autowiseStruct2, )if err ! nil {panic(err)}fmt.Println(自定义规则实现结构体深拷贝注入和装配的演示结果)fmt.Println(注入的变量, injectStruct2, *(injectStruct2.s1), *(injectStruct2.s2))fmt.Println(装配的变量, autowiseStruct2, *(autowiseStruct2.s1), *(autowiseStruct2.s2))fmt.Println(是否相等, injectStruct2 autowiseStruct2, injectStruct2.s1 autowiseStruct2.s1, injectStruct2.s2 autowiseStruct2.s2) }示例结果 最后 至此各位我们已经一起完成了这个依赖注入的小项目 我是醉墨居士我们下篇博客见
http://www.hkea.cn/news/14440650/

相关文章:

  • 怎样做企业手机网站海外贸易平台有哪些
  • 做新浪网网站所需的条件聊城建设银行官方网站
  • 威宁做网站省级精品课程网站建设
  • sns社交网站有哪些线上p2p网站建设
  • 中山网站设计素材淘客网站模版
  • 网站地址跟网页地址区别营销网站开发公司
  • 中小学学校网站建设网站后台数据应该怎么做
  • 网站开发配置状态统计样本软件开发成本估算表
  • 分类信息多城市网站建设银行理财产品网站
  • 优享购物官方网站推广软文200字
  • 网站制作公司怎样帮客户做优化公司名称起名大全免费
  • 网站丢失了怎么办啊建设购物网站费用
  • 无锡企业网站制作公司有哪些阿里指数网站
  • 专业做外贸网站的公司小程序订货系统
  • 医疗器械网站建设方案河北工程大学最新消息
  • 网站提交收录入口链接wordpress 账号图片尺寸
  • 服务专业公司网站建设服务杭州马家厨房食品有限公司成立
  • 绵阳市网站建设公司现在做网站怎么样
  • 做防水网站ui要学哪些知识
  • 专门做婚纱儿童摄影网站做网站百灵鸟
  • 网站备案系统验证码出错搜索软件
  • 公司网站如何做北京网页设计师培训多少钱
  • 东胜区教育网站入口白城网页制作
  • 做宣传类网站需要什么资质成都哪家公司做网站
  • 免费商城网站源码dede游戏网站源码
  • 四川省建设监理管理协会网站加强网站的建设
  • 景洪服装网站建设wordpress nas 外网
  • 直播网站怎么做的网站域名免费吗
  • 厦门 外贸商城网站制作wordpress 阿里云oss
  • 有关做服装的网站吗安顺网站建设公司