使用Unity 实现依赖注入

Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实现非常松散的耦合设计。松散耦合的应用程序更灵活,更易于维护。这样的程序也更容易在开发期间进行测试。你可以模拟对象,具有较强的具体依赖关系的垫片(轻量级模拟实现),如数据库连接,网络连接,ERP连接,和丰富的用户界面组件。例如,处理客户信息的对象可能依赖于其他对象访问的数据存储,验证信息,并检查该用户是否被授权执行更新。依赖注入技术,可确保客户类正确实例化和填充所有这些对象,尤其是在依赖可能是抽象的 。

关于IoC/DI
所谓控制反转(IoC: Inversion Of Control)就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责。这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的反转。比如,在类型A中需要使用类型B的实例,而B实例的创建并不由A来负责,而是通过外部容器来创建。

有时我们又将IoC成为依赖注入(DI: Dependency Injection)。所谓依赖注入,就是由外部容器在运行时动态地将依赖的对象注入到组件之中。具体的依赖注入方式又包括如下三种典型的形式。

构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相应参数对象;
属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,IoC容器会自动初始化该属性;
方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,IoC容器会自动调用该方法。

构造器注入

IPeople.cs

namespace UnityDemo { public interface IPeople { void DrinkWater(); } }

 

VillagePeople.cs

using System; namespace UnityDemo { public class VillagePeople : IPeople { IWaterTool _pw; public VillagePeople(IWaterTool pw) { _pw = pw; } public void DrinkWater() { Console.WriteLine(_pw.returnWater()); } } }

IWaterTool.cs

namespace UnityDemo { public interface IWaterTool { string returnWater(); } }

 

PressWater.cs

namespace UnityDemo { public class PressWater : IWaterTool { public string returnWater() { return "地下水好甜啊!!!"; } } }

Program.cs

using Microsoft.Practices.Unity; namespace UnityDemo { class Program { static void Main(string[] args) { UnityContainer container = new UnityContainer(); // 创建容器 container.RegisterType<UnityDemo.IWaterTool, UnityDemo.PressWater>(); // 注册依赖对象 UnityDemo.IPeople people = container.Resolve<UnityDemo.VillagePeople>(); // 返回调用者 people.DrinkWater(); // 喝水 } } // 构造器注入 // 构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。 // 如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象。 // RegisterType:可以看做是自来水厂决定用什么作为水源,可以是水库或是地下水,我只要“注册”开关一下就行了。 // Resolve:可以看做是自来水厂要输送水的对象,可以是农村或是城市,我只要“控制”输出就行了。 }

Dependency属性注入

属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,IoC容器会自动初始化该属性。

VillagePeople.cs

using Microsoft.Practices.Unity; using System; namespace UnityDemo { public class VillagePeople : IPeople { // 属性注入只需要在属性字段前面加[Dependency]标记就行了 [Dependency] public IWaterTool _pw { get; set; } public void DrinkWater() { Console.WriteLine(_pw.returnWater()); } } } 

调用方式和构造器注入一样,通过

RegisterType< UnityDemo.IWaterTool, UnityDemo.PressWater>();注入就可以了,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/72237947c0d18678115b7385d8d42331.html