搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

我曾想深入了解的:依赖倒置、控制反转、依赖注入

[复制链接]
查看: 62|回复: 0

1万

主题

1万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45261
发表于 2020-2-14 18:26 | 显示全部楼层 |阅读模式
大道至简

我们在软件工程及第行的架构计划、模块实现、编码等工作,很多时候说到底就是围绕一件事举行:解耦。
三层架构,MVC,微办事,DDD.我们分析题目,笼统题目,然后别离界限,别离条理。
也是为了让我们的类、模块、系统有更强的复用本事,进步生产服从。
这一次,我想深入了解和探讨我已经很含糊,也没有不停细致了解的:依靠颠倒、控制反转、依靠注入 这些概念。
什么是依靠?
  1. 凡是可以大白为一种需要,需求。需要帮助才华完成一件事变。
复制代码
例如,我们依靠日志办事写日志:
  1.     public class Contract    {       public void Successed()        {            string msg = "save, successed!";            Log log = new Log();            log.Write(msg);        }    }
复制代码
Contract类正依靠Log类,帮助完成全部营业流程。这就发生了依靠。
什么是笼统? 什么是细节?

我们经常会听说,面向接口编程,依靠于笼统不能依靠于具体实现细节。
我们每次点窜接口时候,必定会去点窜具体实现。可是我们点窜具体实现却很少点窜接口。
所以接口比具体实现更安定。
此时,我们在中心加入一层接口,看看怎样。
  1.     public interface ILog    {        void Write();    }
复制代码
  1.      public void Successed()     {         string msg = "save, successed!";                  ILog log = new Log();         log.Write(msg );     }
复制代码
关系变革如图:
我曾想深入了解的:依赖倒置、控制反转、依赖注入  热点新闻 406456-20200202005516187-616122041

什么是上层模块? 什么是底层模块?

此时,Contract类可以看做上层。Log看做底层。
上层模块:批示控制
底层模块:计谋实现
依靠颠倒

理清楚了 上层、底层、细节、笼统、依靠概念,
我们不难发现,上面的依靠箭头发生了改变。
所以依靠颠倒也由此而来:
  1. 上层模块不应当依靠底层模块,它们都应当依靠于笼统。笼统不应当依靠于细节,细节应当依靠于笼统。
复制代码
依靠颠倒,使得我们的扩大性增强。
  1. public class Log:ILogpublic class NLog : ILogpublic class Log4 : ILog
复制代码
  1. // ILog log = new Log();// ILog log = new Log4();ILog log = new NLog();log.Write(msg);
复制代码
以上代码我们也可以看出,我们需要不停表白点窜Contract类,以致于援用差此外Log组件来应对需求。
每次都要点窜这个类来满足需求(点窜封闭,扩展开放原则),明显是我们所不盼望的。形成这类现象的原因原由是:
由于对于上层的Contract类,不单仅负责营业逻辑的实现,第二职责还要负责日志录例的机关。
对于Program类,有日志办事类间接琶来操纵即可,不需要关心这些实例的机关。
有没有一种机制可以大要将机关和操纵举行分手?使得Contract的职责加倍单一,耦合更低?(单一职责原则)
控制反转
  1. 怎样算是控制反转了呢?
复制代码
我们改一下上面的代码将日志类的实例化控制权,转移到类的内部:
  1.     public class Contract    {      public Contract(ILog log)    }
复制代码
挪用
  1.     class Program    {        static void Main(string[] args)        {            ILog log = new NLog();            Contract contract = new Contract(log);            contract.Successed();        }    }
复制代码
这样,不管内部日志组件怎样变革,都不用会影响现有的Contract类。
Contract只专注于属于自己的职责。上层Contract类和日志类解耦加倍完全。互不影响。
假如从职责角度来看,我们能否是可以有一个类专门来治理建立日志类呢?
就像仓库治理员一样,按照票据出货,不需要关心这些货物到底怎样被操纵的。
  1.      public static class Ioc    {        public static ILog GetLogInstance(int type)        {            switch (type)            {                case 1: return new Log();                case 2: return new Log4();                case 3: return new NLog();                default: return new Log();            }        }    }
复制代码
  1.     class Program    {        static void Main(string[] args)        {                       ILog log = Ioc.GetLogInstance(1);            Contract contract = new Contract(log);            contract.Successed();        }    }
复制代码
依靠注入
  1. 什么是依靠注入呢?
复制代码
实在我们刚刚已经实现过了,全文先是依靠颠倒,然后控制反转,而现在说的依靠注入是控制反转的具体实现方式。
依靠注入是解开依靠并实现反转的一种本事。
大约分为三种方式:

  • 机关函数方式
  1.     public class Contract    {        private ILog _log { get; set; }        public Contract(ILog log)        {            _log = log;        }    }
复制代码
优点: 机关Contract就肯定好依靠。
弱点:前期没法变动依靠。

  • Set方式注入
  1.      public class Contract    {        private ILog _log { get; set; }        public Contract(ILog log)        {            _log = log;        }        public void Successed()        {            string msg = "save, successed!";            _log.Write(msg);        }        public void SetLogInstance(ILog log)        {            _log = log;        }    }
复制代码
优点: 将Log实例化延长,Contract类可以灵活变更依靠。
弱点:操纵_log前需要判定null情况

  • 接口方式注入
  1.      public interface ILogSetter    {        ILog Setter(ILog log);    }
复制代码
  1.     public class Contract: ILogSetter    {        ... ...        public ILog Setter(ILog log)        {            _log = log;            return _log;        }    }
复制代码
接口方式和方式二有点类似,这里将依靠注入提升为一种本事,可以安排依靠关系的本事。
探讨 控制反转

我曾想深入了解的:依赖倒置、控制反转、依赖注入  热点新闻 406456-20200202005516187-616122041

从这个图中,可以看到依靠的颠倒,这里低层界说接口并继续实现,高层援用低层界说的接口举行挪用操纵。
那末现在的控制权是在低层,那末界说接口这个权利到底属于谁?
比如我们有一个流程对应着5个步伐,这5个步伐又对应着5个接口:A1,A2,A3,A4,A5
营业系统a,需要操纵这个流程就需要依次挪用这5个接口:A1 -> A2 -> A3 -> A4 -> A5
现在这个流程很是公用,已经上升成为企业级中台的一个流程,越来越多的营业系统给都在对接。
此时,很多的营业系统需要重新用代码机关一套这样的挪用流程,固然现在的控制权照旧在营业系统这里。
所以此时我们对外公然的5个接口,只是简单供给了挪用本事,对于接口的编排全数寄盼望于营业系统。
这个时候会有两种声音:
1、营业系统不想这么烦琐地反复着编排这些接口
2、中台也想把流程控制权把握在自己手中,这样碰到营业流程的团体性变更,营业系统是不需要调解的
营业流程引擎的加入,就像是我们的接口一样,它负责接口的编排,然后成为营业流程。
我曾想深入了解的:依赖倒置、控制反转、依赖注入  热点新闻 406456-20200214180014897-1472724880

此时,控制权现实在接口供给方。
形式

我们想操纵微软供给的MVC框架,只如果遵照MVC框架的约定就能具有MVC的本事。
MVC的控制权在框架,利用想经过框架供给的MVC本事就必须依照框架的界说去做。
假如框架仅仅是给i我们供给类似于类库一样的MVC实现,
那末全部流程是利用系统自己按照文档,挪用各类类库文件,编排这些实现满足营业系统的MVC需求
我曾想深入了解的:依赖倒置、控制反转、依赖注入  热点新闻 406456-20200214180036156-2044343796

所以,现在的Asp.Net Core 给我们供给的MVC,只如果我们遵照mvc约定,引擎就会鞭策全部信息的活动,终极反应给利用。
这类比力普适的流程大要计划,我们可以成为形式,类似于计划形式,MVC形式.
本来算落在营业系统中的控制权,反向转到形式中。
总结

依靠颠倒可以很小也可以很大,
控制反转也可以很小也可以很大。
这类脑筋我们无时无刻可以碰到。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表