按需分配,共创和谐社会的钥匙:依赖注入

简介: 按需分配,共创和谐社会的钥匙:依赖注入

  历史的发展

  远古母系氏族,每个人都是一个独立的个体,需要什么工具就需要自己去打磨一件工具,自己需要了解所有的流程才能生存。比如打猎,从前期准备绳索,尖木,到中期做陷阱,后期收成,都需要了解的非常透彻。对应编程中便是new 绳索()new 尖木()new 陷阱()new X()。实例化所有需要的资源,然后再进行逻辑流程。

  人类逐渐在进步,工业革命的来袭,改变了整个社会的结构。人再不需要了解所有的流程,只需要去一个工厂或者采购平台,输入自己想要的东西,便能得到。对应编程中便是工厂模式,需要一个静态工厂类,一个抽象产品类型的类,一个你想拿到的可以具象化的产品类,从此便进入了全民淘宝年代,需要什么购买什么。

  当你为了修一个顶楼的灯泡购买了梯子,但当修好后,如何处理这个梯子便成了难题,扔掉不舍,不扔去卖二手又很麻烦。这时候就需要我们的主角:和谐社会登场了!主张不铺张不浪费,这便是一种回收机制,你需要它只需要说一声,秒秒钟就到你手里,你也不需要知道他来自哪里。不需要了你也不用管,我直接秒秒钟再变走。是不是有一种魔术的感觉?这便是依赖注入!依赖注入解除了对象和对象的依赖关系,需要其他对象时候,会有外部直接注入给你,而你不需要。对象符合OCP原则(对外扩展开放,对修改关闭), 容器负责所有关系匹配。在此层,容器便是这个社会的规则,而对象只需要关心自己所完成的一部分就好。轻松惬意!

 

  依赖注入:Dependency Injection

  从起始的new,new,new到后来的多态,面向接口编程,匹配协议规定的规则,直到按需分配,外部注入的控制反转依赖注入。实际上就和人类进步的逻辑是一样的,目的就是为了让工作分配的更明确,更效率,彼此依赖越来越少。依赖注入隔离了变化,让之不会影响不变的对象部分。依赖注入实际上是很多原则的合体。多态使类不再依赖其他服务类,只需要接口,实现了OCP(对外扩展开放,对修改关闭)。为了不需要实例具体的服务类,就需要定义注入点(接口),容器来进行服务,实现注入。

 


  注入容器:Container

  依赖注入需要一个容器来储存所有的资源,根据你的需要按需分配,进行注入。依赖注入还有个名字叫控制反转,就是大家经常说的IOC。

  轻量级的有Unity Container, Autofac, Spring等,重量级有EJB, 还有游离在轻重之间的是JBoss等。之后系列文会详细介绍几种常用的,比如container,autofac,ejb。

  由于本人经常使用prism,orchard,故而会更详细介绍container和autofac,也会把使用心得更多分享给大家。

 

  基本技术:反射

  

  IOC是工厂模式的升华,最基本的技术是“反射”。根据一个注入的匹配表或者规则,来进行灵活的注入。

 

  注入规则:


   1. xml来进行配置。

    Spring使用xml文件来进行beans的匹配。好处在于完全抽离了代码层次,在xml进行配置,用字符串来进行反射注入。但坏处就是xml的维护,需要一个很好的IDE

  2.Assembly注入,class,interface匹配。在.NET里个人比较喜欢这种。

var builder = new ContainerBuilder();
      builder.RegisterGeneric(typeof(Dal<>)).As(typeof(Idal<>)).InstancePerDependency();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency();
builder.Register(c=>new PersionBll((IRepository<Persion>).Resolve(typeof(IRepository<Persion>))));
builder.Register(c => new CustomBll((IRepository<Custom>)
    c.Resolve(typeof(IRepository<Custom>))));
    var container = builder.Build()

这里只大概列出一些例子。具体会有详细介绍在系列篇后篇。

  注入方法:

  1.接口注入,2.构造函数注入,3.属性注入

 

 

  开碟小菜(不使用容器,仅使用接口和实现类来展现依赖注入的基本逻辑)

  场景:家里很多电视,有时候这个可以用,有时候那个可以用。希望能在替换的时候,个人这边是不需要更改什么的,依然是拿起遥控器就能看电视,不管是哪个。

  解决方案:(接口注入)

// 创建实现看电视功能的接口
public interface ITvProvider
{
        void WatchTv();
}
// 创建一个TV的实体类,继承ITvProvider,实现其WatchTv方法。
public class KonkaTv:ITvProvider
{
         public void WatchTv()
         {
                 // 实现看康佳电视功能的逻辑代码
         }
}
// 创建一个注入用的接口,实现类似容器/XML链接对象匹配的功能
public interface ITvInjecter
{
        void InjectTv(ITvProvider tvProvider);
}
// 创建一个看电视的控件,继承ITvInjecter(容器时则是继承类似IDepency这种可以拿到容器, 这里是不使用容器的方法)
public Control WatchTvControl:ITvInjecter
{
        private ITvProvider _tvProvider;
        // 若使用容器,则在构造函数里既可以实现注入,不用手工来写注入方法。
        public void InjectTv(ITvProvider tvProvider)
        {
              _tvProvider = tvProvider
        }
        public WatchTvControl()
        {
             // 注入完成后便可以使用其watchtv方法
              _tvProvider.WatchTv();
        }
}
// 主程序,代码层次实现注入并调用
public partial class App
{
     private void Application_Startup(object sender, StartupEventArgs e)  
        {
               ITvProvider tvProvider = new KonkaTv();
               WatchTvControl watchTvControl = new WatchTvControl();
               watchTvControl.InjectTv(tvProvider);
        }  
}

通过这样的调用,就可是实现解耦和。当你想要更换Tv的时候只需要在主程序中更换就好,其余功能模块则完全不需要更改。(容器则是注入其他Tv实体类就好)

希望大家点赞关注和拍砖。个人是在做.net,比较擅长使用prism和orchard(非常宏大的设计模式集合的CMS框架,分布式网络的福音),对依赖注入的好处感受也比较深刻一些.总之希望大家持续关注。我也会努力提升自己来写出更好文章丰富这个小学堂的,希望每项技术都能映射到现实的例子,其实编程就是人生啊!

目录
相关文章
|
2月前
|
监控
点晴OA系统为企业的发展注入新的活力
点晴OA办公系统是真正完全免费的协同OA系统软件商,而且是不限使用时间,不限用户数,不限功能模块的免费OA办公系统,为企业全面实现行政办公一体化,深受众多企业的青睐。
31 5
|
4月前
|
Java 数据库连接 数据库
Micronaut 响应式编程:乘科技热潮,解锁异步应用新境界,让你的软件快人一步!
【9月更文挑战第11天】在快速发展的软件开发领域,响应式编程凭借其处理异步事件和数据流的优势,逐渐成为构建高效应用的关键技术。Micronaut 作为现代化的 Java 微服务框架,提供了强大的工具和支持,如 Reactive Streams 和 RxJava,帮助开发者轻松构建高性能的异步应用。通过非阻塞的方式处理请求,Micronaut 能充分利用系统资源,提高应用的吞吐量和响应速度。此外,Micronaut 的反应式 Web 客户端和数据库访问模块进一步增强了其在高并发场景下的表现,为现代异步应用的开发提供了坚实的基础。
44 5
|
5月前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
62 0
|
5月前
|
Java 数据库连接 数据库
携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
47 0
|
数据可视化 Devops 开发工具
一文讲透 如何破解低代码“鸡肋”困境?
一文讲透 如何破解低代码“鸡肋”困境?
142 0
|
安全 搜索推荐 JavaScript
全员学习低代码,一汽大众领跑数智化转型背后的秘密|《102个开发者故事》第七期
500位低代码开发者,90%来自一线,低代码开发在一汽-大众百花齐放。
1343 1
全员学习低代码,一汽大众领跑数智化转型背后的秘密|《102个开发者故事》第七期
|
人工智能 数据可视化 安全
科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今
科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今
112 1
|
数据可视化 搜索推荐 BI
低代码,一招制敌,解决职场人的的办公难题
低代码,一招制敌,解决职场人的的办公难题
|
区块链 UED
区块链技术|NFT元宇宙链游如何开发?
NFT元宇宙链游开发是指开发一个基于区块链技术的虚拟世界游戏,其中包含NFT数字资产作为游戏中可获得的物品或货币。此类游戏通常由分布式应用程序(DApp)构建,并使用智能合约和链上交易来管理玩家之间的交互和交易。
|
物联网 区块链 vr&ar
浅谈NFT元宇宙链游系统开发案例及源码分析丨NFT元宇宙链游系统开发技术方案
什么是元宇宙   一个平行于现实世界的虛拟空间,是由AR、VR、互联网所组成的,未来,只要你戴上耳机以及头显设备就可以通过终端连接进入计算机所模拟构建的虛拟世界。(当然现在元宇宙只是一个概念)。
浅谈NFT元宇宙链游系统开发案例及源码分析丨NFT元宇宙链游系统开发技术方案