IoC的全称为Inversion of Control(控制反转),DI的全称为Dependency Injection(依赖注入)。IoC是一个控制容器,我们将设计好的对象放入到容器中,将对象交给容器去主动创建。DI是容器的运行机制,在IoC容器的运行期间,动态的将对象所依赖的对象注入到对象之中。

关于IoC框架有很多,比如从Java中移植过来的Spring.NET和微软的Unity等,这篇文章主要介绍Unity的使用。

我们拿人与手机来做一个示例,在示例中我们需要输出这个人在玩什么手机的一段文字,所以我们需要一下类:

  • People:人类
  • Phone:手机类

People类依赖Phone类,但没有在People类中主动new依赖对象,而是添加了一个带有参数的构造方法,等待依赖对象被注入:

public interface IPeople
{
void PlayPhone();
} public class People : IPeople
{
IPhone _phone = null;
public People(IPhone phone)
{
_phone = phone;
} public void PlayPhone()
{
Console.WriteLine("Play {0}", _phone.IPhoneXS());
}
} public interface IPhone
{
string IPhoneXS();
} public class Phone : IPhone
{
public string IPhoneXS()
{
return "iPhone XS";
}
}

通过注册的方式在控制台输出文字:

static void Main(string[] args)
{
// 初始化容器
UnityContainer unityContainer = new UnityContainer(); // 注册依赖对象
unityContainer.RegisterType<IApple, Apple>();
// 注册调用者
unityContainer.RegisterType<IPeople, People>(); // 返回调用者
IPeople people = unityContainer.Resolve<IPeople>();
people.PlayPhone(); Console.ReadLine();
}

通过传参的方式在控制台输出文字:

static void Main(string[] args)
{
// 初始化容器
UnityContainer unityContainer = new UnityContainer(); // 注册调用者
unityContainer.RegisterType<IPeople, People>(); // 返回调用者并传递参数
// Unity 5.9.x版本语法
ParameterOverride param = new ParameterOverride("phone", new Phone { Name = "IPhone XS" });
IPeople people = unityContainer.Resolve<IPeople>(param); // Unity 5.8.x及以下版本语法
//IPeople people = unityContainer.Resolve<IPeople>(new ParameterOverrides
//{
// { "apple", new Apple() }
//}); people.PlayPhone(); Console.ReadLine();
}

使用IoC容器可以使对象与对象之间的耦合降低,这样整体的架构就变得更加的灵活,维护起来也会变得更加的方便。

作者:huayueniansi
链接:https://www.jianshu.com/p/b30f42245d01
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最新文章

  1. .NET 基础一步步一幕幕[方法、结构、枚举]
  2. IEEE/ACM ASONAM 2014 Industry Track Call for Papers
  3. ubuntu安装Python环境以及科学计算环境
  4. Swift的排序算法总结
  5. 【Android】应用程序启动过程源码分析
  6. latch:cache buffers chains的优化思路
  7. winform datagridview如何获取索引 分类: DataGridView 2014-04-11 13:42 216人阅读 评论(0) 收藏
  8. (转)Iphone数组一些基础操作 NSArray/NSMutableArray
  9. 【BZOJ1014】【JSOI2008】火星人prefix Splay处理区间,hash+dichotomy(二分)check出解
  10. poj 2689 巧妙地运用素数筛选
  11. Google Earth影像数据破解之旅
  12. 面试题(php部分)
  13. dedecms 图集标签{dede:productimagelist} {dede:field name='imgurls'}&nbs
  14. shell for 循环
  15. 2018.5.3 docker
  16. Nagios故障 CHECK_NRPE: Socket timeout after 10 seconds.
  17. html-webpack-plugin插件使用chunks属性时报错
  18. 改变onclick的作用域
  19. 做一个合格的Team Leader -- 领导和管理基本概念 三种激励手段:恐吓、贪念、承诺
  20. ng-src 的坑

热门文章

  1. Excel VBA获取当文件下级子目录或目录中文件
  2. Appium+Python之异常自动截图
  3. void die(const char *msg)
  4. java 中断线程的几种方式 interrupt()
  5. 问题 C: 序列交换
  6. Windows Server 搭建企业无线认证(NPS搭建)
  7. 朴素贝叶斯算法——实现新闻分类(Sklearn实现)
  8. CA认证机制的简明解释
  9. OGG replicat复制进程的拆分
  10. Oracle Set操作