博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回头再学Asp.net系列--基础篇(六)
阅读量:7283 次
发布时间:2019-06-30

本文共 1170 字,大约阅读时间需要 3 分钟。

随着面向对象分析与设计的发展,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响(这也是OCP的目的)。为了做到这一点,要利用面向对象中的多态性,使用多态性后,客户类不再直接依赖服务类,而是依赖于一个抽象的接口,这样,客户类就不能在内部直接实例化具体的服务类。

但是,客户类在运作中又客观需要具体的服务类提供服务,因为接口是不能实例化去提供服务的。就产生了“客户类不准实例化具体服务类”和“客户类需要具体服务类”这样一对矛盾。
依赖注入(Dependency Injection),是这样一个过程:由于某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点。在程序运行过程中, 客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行。
Setter注入(Setter Injection)是指在客户类中,设置一个服务类接口类型的数据成员,并设置一个Set方法作为注入点,这个Set方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。构造注入(Constructor Injection)是指在客户类中,设置一个服务类接口类型的数据成员,并以构造函数为注入点,这个构造函数接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。
上面提到的注入方式,都是客户类被动接受所依赖的服务类,这也符合“注入”这个词。不过还有一种方法,可以和依赖注入达到相同的目的,就是依赖获取。
可以看到,这种方法变被动为主动,使得客户类在需要时主动获取服务类,而将多态性的实现封装到获取点里面。获取点可以有很多种实现,也许最容易想到 的就是建立一个Simple Factory作为获取点,客户类传入一个指定字符串,以获取相应服务类实例。如果所依赖的服务类是一系列类,那么依赖获取一般利用Abstract Factory模式构建获取点,然后,将服务类多态性转移到工厂的多态性上,而工厂的类型依赖一个外部配置,如XML文件。
不过,不论使用Simple Factory还是Abstract Factory,都避免不了判断服务类类型或工厂类型,这样系统中总要有一个地方存在不符合OCP的if…else或switch…case结构,这种缺 陷是Simple Factory和Abstract Factory以及依赖获取本身无法消除的,而在某些支持反射的语言中(如C#),通过将反射机制的引入彻底解决了这个问题

依赖获取(Dependency Locate)是指在系统中提供一个获取点,客户类仍然依赖服务类的接口。当客户类需要服务类时,从获取点主动取得指定的服务类,具体的服务类类型由获取点的配置决定。

转载地址:http://kdkjm.baihongyu.com/

你可能感兴趣的文章
AWS推出RoboMaker,可构建智能机器人应用程序
查看>>
1100名达摩院“扫地僧”加持,阿里云的下一个十年
查看>>
取代ZooKeeper!高并发下的分布式一致性开源组件StateSynchronizer
查看>>
《Elasticsearch in Action》书评与作者访谈
查看>>
腾讯云发布CDN 2.0,四大优势加速移动化进程
查看>>
Visual Studio 2017 15.6预览版最新进展
查看>>
ZenHub Epics创造了GitHub中敏捷Epics
查看>>
《七周七并发模型》作者Paul Butcher、阿里云研究员余锋(褚霸)——QCon北京2016前瞻...
查看>>
iOS应用开发登陆Windows平台惹争议
查看>>
《Java 20年:道路与梦想》迷你书发布
查看>>
GitHub的MySQL高可用性实践
查看>>
微软发布Azure Application Insights for Node.js 1.0版本
查看>>
UPYUN亮相GIF2016 展示实时性能监控系统
查看>>
Node.js async.parallelLimit 与 async.eachLimit 的区别与不同使用场景
查看>>
AI一周热闻:12306数据泄露,嫌疑人被捕;BERT提升文档检索性能至1.5-2倍
查看>>
知道大数据却不清楚工业大数据,知识架构“欠”在哪里?
查看>>
DIY FSK RFID Reader
查看>>
MySQL分库分表备份脚本
查看>>
在成员服务器上卸载exchange 2003后,需要在DC主域上重新启动。
查看>>
创建自定义的指令
查看>>