IoC与DI,Unity的使用

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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自www.cnblogs.com/Jeely/p/10950787.html