依赖注入DI
说AOP不得不提依赖注入,先来看看一个实例。通过实例来解释依赖注入和它的用途。
我们现在要设计一个关于衣服的上架功能,有时候需要进行促销,我们现在知道的促销方式有打1折,和打2折。
最初的方案:
public class Cloth
{
;
public IRebate rebate = new OneRebate();
public decimal GetPrice()
{ return OneRebate();
}
private decimal OneRebate()
{
return price * Convert.ToDecimal(0.1);
}
private decimal TwoRebate()
{
return price * Convert.ToDecimal(0.2);
}
}
控制台代码,
class Program
{
static void Main(string[] args)
{
Cloth c = new Cloth();
string value = c.GetPrice().ToString();
Console.WriteLine(value);
Console.Read();
}
}
不错,我们改动GetPrice()方法就可以调换不同的促销方式了。
过了几天,我们需要一个新的促销,3折的折扣。我们开始动工了,改改衣服类添加个3折的促销方法,再来改Main方法,调用3折的优惠,完工。
再后来我们要4折、5折、6折.. 你是不是开始躁了。而且这样的设计违背了开放封闭原则,每次改动都需要改Cloth类,修改方法。
这时我们来试试依赖注入,我们来改下之前的方案,
促销接口:
/// <summary>
/// 促销接口
/// </summary>
public interface IRebate
{
decimal MakeRebate(decimal price);
}
然后实现折扣接口实现1折类和2折类:
/// <summary>
/// 1折
/// </summary>
public class OneRebate:IRebate
{
public decimal MakeRebate(decimal price)
{
return price * Convert.ToDecimal(0.1);
}
}
/// <summary>
/// 2折
/// </summary>
public class TwoRebate:IRebate
{
public decimal MakeRebate(decimal price)
{
return price * Convert.ToDecimal(0.2);
}
}
衣服类:
public class Cloth
{
;
public IRebate rebate;
public decimal GetPrice()
{
return rebate.MakeRebate(price);
}
}
控制台代码:
class Program
{
static void Main(string[] args)
{
Cloth c = new Cloth();
c.rebate = new OneRebate();
string value = c.GetPrice().ToString();
Console.WriteLine(value);
Console.Read();
}
}
现在,我们添加新的促销,不用再修改之前的Coloth,而是填加新的促销类,并继承促销接口。在客户端实例化需要的促销方式就可以调用新的促销了。
什么是依赖注入?依赖注入好处在哪里?
来看看什么是依赖注入,很简单我们只是在Cloth里添加了一个接口,让客户端来实例化这个接口,从而调用不同的促销类。也就是让业务逻辑来决定如何实例化。
好处就是依赖注入很好的遵循了开放封闭原则。你会说,"我裤子都脱了,你就让我看这个?",我想说是的,但是这个原则的意义却很重要。
依赖注入实现有哪些方式?
1、setter注入,也就是实例中的方法,申明一个接口作为属性,客户端直接赋值。
2、构造函数注入,这种方式只不过是申明一个构造函数,让客户端在创建Cloth实例的时候就初始化促销类。用这种方式可以限制客户端必须创建促销类,我个人比较提倡这种方式,让代码更容易理解。
扩展
我们虽然实现了依赖注入,但是当我们换新的促销方式的时候是不是很麻烦?每次都要修改Main()方法,去实例化不同的促销。
spring.net框架为我们很好地解决了这个问题,
先引用spring组件,添加配置文件
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns='http://www.springframework.net' default-autowire="byName"> <object id="rebate" type="spring.net.TwoRebate,spring.net"/> <object id ="Cloth" type="spring.net.Cloth,spring.net"/> </objects>
修改控制台代码:
class Program
{
static void Main(string[] args)
{
XmlApplicationContext applicationContext = new XmlApplicationContext("XMLFile1.xml");
Cloth c = (Cloth)applicationContext.GetObject("Cloth");
string value = c.GetPrice().ToString();
Console.WriteLine(value);
Console.Read();
}
}
当需要用OneRebate促销是,只用修改配置文件就可以了。spring.net的使用就不详细解释了,可以参考spring.net的文档或百度了解一下。有需要的话可以留言交流
依赖注入DI的更多相关文章
- [Android]使用Dagger 2依赖注入 - DI介绍(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5092083.html 使用Dagger 2依赖注入 - DI介 ...
- 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路
开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...
- 依赖注入(DI)和Ninject,Ninject
我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...
- 控制反转IOC与依赖注入DI
理解 IOC http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例 的http:// ...
- Atitit js中的依赖注入di ioc的实现
Atitit js中的依赖注入di ioc的实现 全类名(FQCN)为标识符1 混合请求模式1 使用类内 builder 即可..2 Service locator method走ok拦2 Jav ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...
- 控制反转IOC与依赖注入DI【转】
转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...
- 依赖注入(DI)和控制反转(IOC)
依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...
- MVC进阶之路:依赖注入(Di)和Ninject
MVC进阶之路:依赖注入(Di)和Ninject 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类, ...
- 依赖注入(DI)和Ninject
[ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject 本文目录: 1.为什么需要依赖注入 2.什么是依赖注入 3.使用NuGet安装库 4.使用Ninject的一般步骤 5. ...
随机推荐
- WebView无法放大缩小解决方式
先看看我们之前所写的代码 1) 加入权限:AndroidManifest.xml中必须使用了许可"android.permission.INTERNET" 2) 使用了一个WebV ...
- jQuery插件编写及链式编程模型
jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...
- DB2数据类型
DB2数据库的内置数据类型主要分成数值型(numeric).字符串型(character string).图形字符串(graphic string).二进制字符串型(binary string)或日期 ...
- 表单元素的外观改变(webkit and IE10)
1.禁止表单默认外观: input,select{ -webkit-appearance:none; appearance:none; }2.伪元素改变ie10表单元素默认外观 select::-ms ...
- jQuery实现表格行的动态增加与删除
删除之前删除2行后: 1<script> 8 $(document).ready(function(){ 9 //<tr/>居中 10 $("#tab tr" ...
- c# 播放器 支持所有格式
原文:c# 播放器 支持所有格式 ---恢复内容开始--- 直接上代码 internal static class LibVlcAPI { internal struct PointerToArray ...
- android数据库升级的措辞
在基类table增加upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbB ...
- Asterisk 未来之路3.0_0001
原文:Asterisk 未来之路3.0_0001 第一章:电信技术革命 刚开始他们忽视你,然后他们嘲笑你,然后他们向你挑战,最后你赢了 ---Mahatma Ganhdi 在5年前,我最初规划写一本关 ...
- [LeetCode] ZigZag Conversion [9]
称号 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- 《Programming Hive》读书笔记(两)Hive基础知识
<Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...