【ASP.NET MVC 学习笔记】- 04 依赖注入(DI)
2017-02-10 11:23
513 查看
本文参考:https://www.geek-share.com/detail/2586882620.html
1、在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用。这种"需要",就称为依赖注入(Dependency Injection)。
2、依赖注入和和所谓的控制反转(Inversion of Control )是一个意思。
3、依赖注入是通过接口实现松耦合的设计模式,是解耦的重要手段。
4、依赖注入分为两步:移除对组件的依赖;通过类的构造器(或setter访问器)来传递实现了公开接口的组件的引用。
5、示例:
- 产品类定义
public class Product { public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } }
- 公开接口定义
public interface IValueCalculator { decimal ValueProducts(params Product[] products); }
- 公开接口实现类
public class LinqValueCalculator : IValueCalculator { public decimal ValueProducts(params Product[] products) { return products.Sum(p => p.Price); } }
- 使用接口的类(不依赖注入)
public class ShoppingCart { //计算购物车内商品总价钱 public decimal CalculateStockValue() { Product[] products = { new Product {Name = "西瓜", Category = "水果", Price = 2.3M}, new Product {Name = "苹果", Category = "水果", Price = 4.9M}, new Product {Name = "空心菜", Category = "蔬菜", Price = 2.2M}, new Product {Name = "地瓜", Category = "蔬菜", Price = 1.9M} }; IValueCalculator calculator = new LinqValueCalculator(); //计算商品总价钱 decimal totalValue = calculator.ValueProducts(products); return totalValue; } }
- 使用接口的类(依赖注入)
public class ShoppingCart { IValueCalculator calculator; //构造函数,参数为实现了IValueCalculator接口的类的实例 public ShoppingCart(IValueCalculator calcParam) { calculator = calcParam; } //计算购物车内商品总价钱 public decimal CalculateStockValue() { Product[] products =
{ new Product {Name = "西瓜", Category = "水果", Price = 2.3M}, new Product {Name = "苹果", Category = "水果", Price = 4.9M}, new Product {Name = "空心菜", Category = "蔬菜", Price = 2.2M}, new Product {Name = "地瓜", Category = "蔬菜", Price = 1.9M} }; //计算商品总价钱 decimal totalValue = calculator.ValueProducts(products); return totalValue; } }
这样就彻底断开了ShoppingCart和LinqValueCalculator之间的依赖关系,使用实现了IValueCalculator接口的类(示例中的LinqValueCalculator)的实例引用作为参数,传递给ShoppingCart类的构造函数。ShoppingCart类不知道也不关心这个实现了IValueCalculator接口的类是什么,更没有责任去操作这个类。
ShoppingCart、LinqValueCalculator和IValueCalculator之间的关系:
相关文章推荐
- 【ASP.NET MVC 学习笔记】- 03 Razor语法
- Asp.net Socket多线程 简单监听端口,获得数据
- 【ASP.NET MVC 学习笔记】- 02 Attribute
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
- 【ASP.NET MVC 学习笔记】- 01 理解MVC模式
- Asp.net 子域共享cookie
- Asp.net 子域共享cookie
- ASP.NET与ASP.NET Core用户验证Cookie并存解决方案
- ASP.NET Web API下对比测试Jil序列化性能
- ASP.NET MVC (六-1) Razor视图引擎
- asp.net发布网站错误
- Asp.Net生成RSS方法
- 虚拟空间ASP程序添加百度编辑器ueditor,支持批量上传图片
- 服务器无法处理请求。 ---> 未将对象引用设置到对象的实例
- ASP.NET MVC页面重定向简单介绍
- .net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2
- ASP.NET MVC4 WEB API入门 第二篇:ASP.NET MVC入门基础(2)—— 简单登录功能的实现
- asp.net 网页 chart图标x轴标签显示不全的解决方法
- ASP.NET后台输出js
- Spring @AspectJ 实现AOP 入门例子(转)