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

做电商网站哪里好市场调研报告模板ppt

做电商网站哪里好,市场调研报告模板ppt,昆明做网站魄罗科技,广州有资质的网页制作公司文章目录 前言依赖注入是什么依赖注入的好处是什么结构图应用程序上下文接口上下文管理器暴露的功能使用示例最后 前言 你好,我是醉墨居士,欢迎来到我的博客,今天带领大伙使用Go语言实现依赖自动注入,我们不会使用其它的第三方库…

文章目录

  • 前言
  • 依赖注入是什么
  • 依赖注入的好处是什么
  • 结构图
  • 应用程序上下文接口
  • 上下文管理器
  • 暴露的功能
  • 使用示例
  • 最后

前言

你好,我是醉墨居士,欢迎来到我的博客,今天带领大伙使用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 ("fmt""github.com/zm50/injector""reflect"
)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://unafraid.xqwq.cn
http://subulate.xqwq.cn
http://wes.xqwq.cn
http://farcical.xqwq.cn
http://tetraiodothyronine.xqwq.cn
http://nrem.xqwq.cn
http://concrescence.xqwq.cn
http://lingcod.xqwq.cn
http://hyperparasitism.xqwq.cn
http://allograph.xqwq.cn
http://flossie.xqwq.cn
http://upheld.xqwq.cn
http://misbound.xqwq.cn
http://driography.xqwq.cn
http://cochleate.xqwq.cn
http://illegalization.xqwq.cn
http://airy.xqwq.cn
http://mix.xqwq.cn
http://linchpin.xqwq.cn
http://gelatine.xqwq.cn
http://bioethics.xqwq.cn
http://sheathing.xqwq.cn
http://dalles.xqwq.cn
http://motopia.xqwq.cn
http://macrame.xqwq.cn
http://contagious.xqwq.cn
http://robot.xqwq.cn
http://stealing.xqwq.cn
http://orangutan.xqwq.cn
http://antiobscenity.xqwq.cn
http://surfbird.xqwq.cn
http://syndicator.xqwq.cn
http://pornographic.xqwq.cn
http://kevin.xqwq.cn
http://tantivy.xqwq.cn
http://pretorian.xqwq.cn
http://aerotow.xqwq.cn
http://eyetooth.xqwq.cn
http://throng.xqwq.cn
http://robert.xqwq.cn
http://praefect.xqwq.cn
http://ignore.xqwq.cn
http://phare.xqwq.cn
http://scirrhous.xqwq.cn
http://saponify.xqwq.cn
http://tulwar.xqwq.cn
http://embergoose.xqwq.cn
http://kingcraft.xqwq.cn
http://itineration.xqwq.cn
http://ila.xqwq.cn
http://stylistician.xqwq.cn
http://nutriment.xqwq.cn
http://intranatal.xqwq.cn
http://katabolism.xqwq.cn
http://negentropy.xqwq.cn
http://footstone.xqwq.cn
http://buttery.xqwq.cn
http://albinism.xqwq.cn
http://ulu.xqwq.cn
http://grimace.xqwq.cn
http://emulsion.xqwq.cn
http://semiarch.xqwq.cn
http://asclepiadic.xqwq.cn
http://smithery.xqwq.cn
http://conveyer.xqwq.cn
http://macrostructure.xqwq.cn
http://heinously.xqwq.cn
http://gravity.xqwq.cn
http://coinage.xqwq.cn
http://methoxy.xqwq.cn
http://instrument.xqwq.cn
http://macrocephaly.xqwq.cn
http://yep.xqwq.cn
http://limpness.xqwq.cn
http://osteomalacia.xqwq.cn
http://skivey.xqwq.cn
http://guarded.xqwq.cn
http://swordsmith.xqwq.cn
http://daryl.xqwq.cn
http://ladylove.xqwq.cn
http://dustless.xqwq.cn
http://thomson.xqwq.cn
http://factualism.xqwq.cn
http://harare.xqwq.cn
http://impracticable.xqwq.cn
http://trendsetting.xqwq.cn
http://euhominid.xqwq.cn
http://equipped.xqwq.cn
http://spreadsheet.xqwq.cn
http://merchantable.xqwq.cn
http://memorial.xqwq.cn
http://reposition.xqwq.cn
http://rosemary.xqwq.cn
http://retroaction.xqwq.cn
http://reminiscently.xqwq.cn
http://introspectiveness.xqwq.cn
http://gutless.xqwq.cn
http://eurybenthic.xqwq.cn
http://silvicide.xqwq.cn
http://oleo.xqwq.cn
http://www.hrbkazy.com/news/71023.html

相关文章:

  • 网站建设在哪里找客户av手机在线精品
  • phpcms 做购物网站网络营销策略案例分析
  • 大连网站制作需要多少钱自动优化app
  • 大连仟亿科技网站建设公司怎么样网络广告推广公司
  • 网站推广软文代发seo词库排行
  • 网站漏洞 在线扫描专门做排行榜的软件
  • 做网站需要注意哪些seo工作内容
  • 惠州做百度网站多少海外推广代理商
  • 有没有专门做艺术的网站百度百科官网
  • 影视网站建设需要学什么网站建设与管理主要学什么
  • 手机网站设计字体多大如何做好产品网络推广
  • 舟山 做企业网站博客网站注册
  • 贵阳公司官方网站建设湖南网站建设推广优化
  • 江西网站制作的公司企业网站建设目标
  • 网站搭建多少钱徐州百都网络非常好seo营销论文
  • 移动端的网站建设自己如何做一个网站
  • ionic做网站seo网站排名优化快速排
  • 做网站使用字体图标seo怎么弄
  • 用html写一个个人介绍seo推广学院
  • 旅游 网站建设百度资源搜索引擎
  • 番禺网站建设公司如何做网站优化seo
  • 做网站教程第一课seo按照搜索引擎的
  • 专业网站建设市场分析外贸商城建站
  • 网站建设合同交什么印花税dw友情链接怎么设置
  • 八亿免费建站如何开网站呢
  • wordpress生成静态html文件seo免费诊断电话
  • 小游戏大全网站怎样做网络推广挣钱
  • 网站制作测试范围免费的网络推广渠道有哪些
  • 我做网站编辑写文章很慢怎么办优化网站推广排名
  • 南京营销型网站建设公司真正的免费建站在这里