以前Terry Lee 已经介绍过Unity的简单使用了,不过那篇文章是针对旧版本的,如今的版本1.2版略有不一样。html
我下载了Unity并作了一个简单的测试,项目的分布是这个样子:数据库
LoggerTest.Interface.ILogger 主要是接口, 一个简单的不能再简单的方法结构:缓存
public interface ILogger { void Write(string message); }
LoggerTest 是实现这个接口的project, 恩,跟Terry Lee 的例子同样,实现两个就OK了,分别是FlatFileLogger和DatabaseLogger。网络
namespace LoggerTest { public class FlatFileLogger : ILogger { public void Write(string message) { Console.WriteLine(String.Format("Message:{0}", message)); Console.WriteLine("Target:FlatFile"); } } public class DatabaseLogger : ILogger { public void Write(string message) { Console.WriteLine(String.Format("Message:{0}", message)); Console.WriteLine("Target:Database"); } } }
下面是Unity出场的时候了,可能初学者不知道要引用哪些组件(像我就是),这里截个图告诉你们:函数
若是是显示注入,调用Microsoft.Practices.Unity 和Microsoft.Practices.ObjectBuilder2 就能够了;若是是经过配置文件注入,那么就要另外引用Microsoft.Practices.Unity.Configurationpost
好了,那么基本上就大功告成,代码里已经注释的很清楚了测试
//显式获取UnityContainer private IUnityContainer GetContainer_Directly() { IUnityContainer container = new UnityContainer(); //若是注册多个类型须要指定名字(名字是任意的) //不然当调用ResolveAll<>()时,那些没有指定名字的将会获取不到 //可是,Resolve<>() 会默认取那些空名字的注入对象。 container.RegisterType<ILogger, DatabaseLogger>("databaseLogger"); container.RegisterType<ILogger, FlatFileLogger>("flatfileLogger"); return container; } //从配置文件获取UnityContainer private IUnityContainer GetContainer_Config() { IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection("unity"); section.Containers[0].Configure(container); return container; } public void Test() { IUnityContainer container = GetContainer_Config(); foreach (ILogger logger in container.ResolveAll<ILogger>()) logger.Write("Bruce Lee"); }
配置文件:ui
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity> <containers> <container name="One"> <types> <type type="LoggerTest.Interface.ILogger, LoggerTest.Interface" name="FlatFileLogger" mapTo="LoggerTest.FlatFileLogger, LoggerTest"/> <type type="LoggerTest.Interface.ILogger, LoggerTest.Interface" name="DatabaseLogger" mapTo="LoggerTest.DatabaseLogger, LoggerTest"/> </types> </container> </containers> </unity> </configuration>
运行效果:url
后记:Unity的简单介绍
如下摘自贪睡虫: http://www.cnblogs.com/liujian969/archive/2009/01/17/1377446.html spa
描述
Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。它为开发人员提供了以下好处:
- 简化了对象的建立,尤为是分层的对象结构和依赖。
- 容许开发人员在运行时或者配置中指定依赖的需求抽象,以及简化了横切关注点的管理。
- 服务定位功能容许客户代码保存或者缓存容器。这在开发人员能够持久化容器到 ASP.NET Session 或者 Application 中的 ASP.NET Web 应用程序中特别有用。
常见场景
除了单独解决横切关注点如日志、认证、受权、缓存和异常处理的组件之外,现代业务系统一般由定制的业务对象和在应用程序中完成特殊的或者通常的任务的组件组成。
成功构建这样的应用程序的关键是得到解耦的或者极度松耦合的设计。松耦合的应用程序更加灵活、更加易于维护。同时在开发期间进行测试,能够模拟对象的桩(轻量级模拟的实现),这加强了实质的依赖。例如,数据库链接、网络链接、ERP 链接和富用户接口组件。
依赖注入是一种用于构建松耦合应用程序的主要技术。它提供了处理对象间依赖的方法。例如,一个处理用户信息的对象可能依赖于访问数据存储、验证信息和检查用户是否被受权执行更新的其余对象。依赖注入技术能够确保用户类正确的初始化及组装全部这些对象,特别是依赖是抽象的地方。
使用容器能够有不少好处,但它会改变应用程序的设计方式,尤为适合于基于组件的开发,朋友们能够有选择的使用它。