wordpress move 下载,win7最好的优化软件,弹窗网站制作,怎么注册公司微信公众号象的控制权交由配置文件控制#xff0c;然后根据配置文件中的信息#xff08;程序集类型#xff09;#xff0c;通过反射来获取对象#xff0c;而不是直接new对象#xff0c;这也是控制反转的一种体现。IoC容器会连接程序中的所有模块#xff0c;模块将所需对象的控制权… 象的控制权交由配置文件控制然后根据配置文件中的信息程序集类型通过反射来获取对象而不是直接new对象这也是控制反转的一种体现。IoC容器会连接程序中的所有模块模块将所需对象的控制权都交由IoC容器控制IoC容器会根据用户配置的信息将各个模块所需要的对象事先创建完成然后IoC容器可以通过依赖注入DI的方式为模块注入所需对象还有依赖查找DL依赖注入就是一种具体实现的手段。依赖倒置原则、控制反转和依赖注入并不是为程序带来新的功能而是使得程序中模块的耦合性降低提高每个模块的复用性。举个栗子就拿生活中最常见的自助取款机来说一下首先我们要拥有一张银行卡例如建设银行的银行卡CCBCard类设计的一些属性可能不太合理不过重要的是了解思想//建行银行卡public class CCBCard{//银行卡中的钱public decimal Money { get; set; }//银行卡名字public String Name { get; set; }public CCBCard(decimal money,String name) {this.Money money;this.Name name; }}然后我们来创建一个ATM自动取款机类该取款机拥有取钱和存钱的功能ATM机1.0//自动取款机public class ATM{//建行银行卡public CCBCard Card new CCBCard(1000,建行卡);//取钱public void SubMoney(decimal money) {//判断余额是否足够if (Card.Money money) {//取钱this.Card.Money - money; Console.WriteLine($取钱成功余额{Card.Money}); }else { Console.WriteLine(余额不足); } }//存钱public void AddMoney(decimal money) {//存钱this.Card.Money money; }}因为这个例子是生活中非常常见的所以大家肯定一眼就看出了不妥此时的ATM机可是说是个非常“睿智”的ATM机了我去取钱而ATM机却自带了一张建行银行卡与其说是个ATM机倒不如说只能对一个CCBCard建行卡进行存取的机器。此时ATM类完全依赖于CCBCard对象而且CCBCard对象也是由ATM类创建的如果CCBCard修改了或者要换其他的卡ATM机还要做出修改。所以接下来我们应该将这不好的两点改掉1、ATM机只能读取单一的CCBCard卡ATM控制CCBCard对象的创建2、ATM只能读取CCBCard类型的卡ATM完全依赖于CCBCard对象先来解决第一点接下来我们改进一下为ATM机增加构造函数通过构造函数传递CCBCard对象使得ATM机可以操作其他建行卡ATM机2.1增加构造函数两个方法不用变//建行银行卡public CCBCard Card;//构造函数传入CCBCard对象public ATM(CCBCard card){this.Card card;}使用//银行卡CCBCard card new CCBCard(1000,建行卡);//ATMATM atm new ATM(card);//取钱atm.SubMoney(100); 然后来解决第二个问题只能存取建行卡此时就需要用到依赖倒置原则让ATM类依赖于CCBCard抽象而不是具体的实现。如果我们想存取其他银行卡里面的钱必须为所有的银行卡抽象出一个接口然后让所有银行卡子类都实现这个接口。//银行卡接口public interface ICard{string Name { get; set; }decimal Money { get; set; }}建行卡实现该接口//建行银行卡public class CCBCard:ICard{//银行卡中的钱public decimal Money { get; set; }//银行卡名字public String Name { get; set; }public CCBCard(decimal money,String name) {this.Money money;this.Name name; }}使得ATM机依赖于ICard接口(修改了Card属性和构造函数)而且ATM机并不控制ICard的子类而是将控制权交由调用者。这一切才合情合理啊无论用户插入什么卡该ATM机都能进行存取。这就是控制反转而通过构造函数传入的ICard对象则是通过依赖注入的方式注入对象。//建行银行卡public ICard Card;//构造函数传入ICard对象依赖注入public ATM(ICard card){this.Card card;}依赖注入还有其他两种通过接口和属性注入//属性注入public ICard Card { get; set; }//接口注入//该方法实现了接口public void Inject(ICard card){this.Card card;}而接口注入就是通过方法注入此种方式会增加不必要的接口现在基本不使用大多为构造函数注入。新添加一个ICBC工商银行卡进行测试//工商银行卡public class ICBCCard : ICard{public string Name { get; set; }public decimal Money { get; set; }}测试//建设银行卡CCBCard bcard new CCBCard(1000, CCB);//工商银行卡ICBCCard ccard new ICBCCard(){ Money 1000, Name ICBC};//ATMATM atm1 new ATM(bcard);ATM atm2 new ATM(ccard);//取钱atm1.SubMoney(100);IoC容器就是专门为ATM机这种模块服务的它就像是一个大齿轮一样连接所有小齿轮模块它运转整个程序便运转如果有些模块可能需要用到其他模块中的对象它们并不会直接依赖而是全都由IoC容器控制。虽然互相需要但是互不依赖IoC容器会事先将ICard子类创建好然后通过依赖注入注入到ATM机中Unity、Spring.NET等框架都是封装完善的IoC容器ATM机只管接收只管索取。ATM机是不对子类进行创建的控制权在用户手里由用户控制ATM机操作何种银行卡就像你去取钱一样你插入什么卡自助取款机都可以取钱这看起来是多么平常的一件事很多看起来高大上的思想都是从需求演变过来的然后由前人一点点探索研究总结出来。至此ATM机已经完成了可能因为ATM机太常见了所以我所说的一切你都可以想到换卡换不同银行的银行卡就像是在说废话如果你都理解了那么根据ATM机你应该仔细的思索一下你所设计的类和模块满不满足像ATM机一样的“功能”原文链接https://www.cnblogs.com/ckka/p/11448065.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com