Microsoft 的 P&P 团队在 12 日发布了 Unity 的社区预览版,大家可以在Unity 的站点上查看它的最新信息。
从今天开始,我将和大家一起来学习这个控制反转(Inversion of Control,IoC) 和依赖注入(Dependency Injection,DI) 容器的使用。关于 IoC 和 DI,大家可以参考 Martin Fowler 著的《IoC 容器和 Dependency Injection 模式》。
描述
Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。它为开发人员提供了如下好处:
- 简化了对象的创建,尤其是分层的对象结构和依赖。
- 允许开发人员在运行时或者配置中指定依赖的需求抽象,以及简化了横切关注点的管理。
- 服务定位功能允许客户代码保存或者缓存容器。这在开发人员可以持久化容器到ASP.NETSession 或者 Application 中的 ASP.NETWeb 应用程序中特别有用。
常见场景
除了单独解决横切关注点如日志、认证、授权、缓存和异常处理的组件以外,现代业务系统通常由定制的业务对象和在应用程序中完成特殊的或者一般的任务的组件组成。
成功构建这样的应用程序的关键是获得解耦的或者极度松耦合的设计。松耦合的应用程序更加灵活、更加易于维护。同时在开发期间进行测试,可以模拟对象的桩(轻量级模拟的实现),这增强了实质的依赖。例如,数据库连接、网络连接、ERP 连接和富用户接口组件。
依赖注入是一种用于构建松耦合应用程序的主要技术。它提供了处理对象间依赖的方法。例如,一个处理用户信息的对象可能依赖于访问数据存储、验证信息和检查 用户是否被授权执行更新的其他对象。依赖注入技术可以确保用户类正确的初始化及组装所有这些对象,特别是依赖是抽象的地方。
使用容器可以有很多好处,但它会改变应用程序的设计方式,尤其适合于基于组件的开发,朋友们可以有选择的使用它。
最基本的代码
myContainer.Register < IMyObject,MyRealObject > ();
IMyObjectmyRealObjectInstance myContainer.Get IMyObject ();
在上面的代码中,首先使用容器的 Register 方法注册了一个 IMyObject 接口到 MyRealObject 具体类的类型映射(注:映射还可以通过配置文件来进行指定),然后通过 Get 方法来获取 IMyObject 接口的默认映射所对应的具体对象实例。在这里,IMyObject 接口被做为映射的键,Get 方法通过它来查找注册的具体类的实例。
假如,我们有如下的类定义:
@H_502_74@public class MyObject{MyObject(MyDependentClassmyInstance){
myInstance.UserName myInstance.ToString();
Console.WriteLine( string .Format( " Mynameis{0}. " ,myInstance.UserName));
}
}