Unity依赖注入容器的应用
定义:Unity Application Block (Unity)是一个轻量级、可扩展的依赖注入容器,所谓依赖注入容器,即组件之间的依赖关系由容器在运行期决定,容器动态的将某种依赖关系注入到组件之中,实现构建高度松耦合的软件的工具,依赖注入容器处理相互关联组件的所有细节,因此你可以构建一个独立的组件,提升组件重用的概率,为系统搭建一个灵活、可扩展的平台。
功能:它有助于构建松耦合的应用程序和为开发者提供以下便利:
1,它提供了创建(或者装配)对象实例的机制,简化对象的创建,特别在分层对象结构和依赖的情形下
2,它支持需求的抽象化,这允许开发人员在运行时或在配置文件中指定依赖,简化横切关注点(crosscutting concerns)的管理
3,它通过把组件配置推给容器来决定,增加了灵活性
4,服务定位能力;这使客户端能够存储或缓存容器
说明:其实说的白一点Unity是一个用来构建插件式系统的解决方案,我们的应用程序有各个功能模块组件组成,各个组件通过依赖关系与系统高度松耦合。在开发程序时只预留接口,让组件来继承这些接口实现功能,具体怎么实现的应用程序不管,有组件负责,应用程序只管调用接口,完成功能。
实例:下面的例子会让我们对Unity依赖注入容器有所了解
需求是这样的,我们的应用程序有一个日志模块,根据不同的需求和部署,我们来可能会把日志记录在不同的地方,如:文本、数据库。。。
1,定义日志接口类:
{
bool Append(string s);
}
2,记录日志到文本 实现类ILogger接口
/// 记录日志到文本中
/// </summary>
public class FileLogger : ILogger
{
public bool Append(string s)
{
//代码部分省略
throw new NotImplementedException();
}
}
3,记录日志到数据库 实现类ILogger接口
代码
/// 记录日志到数据库中
/// </summary>
public class DbLogger : ILogger
{
public bool Append(string s)
{
//代码部分省略
throw new NotImplementedException();
}
}
4,调用
{
static void Main(string[] args)
{
AddLog("程序已启动");
}
static public void AddLog(string log)
{
//创建容器
IUnityContainer myContainer = new UnityContainer();
//从配置文件中获取注入对象
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(myContainer);
//获取对象实例
ILogger logger = myContainer.Resolve<ILogger>();
//调用对象方法
logger.Append(log);
}
}
5,配置信息
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<containers>
<container>
<types>
<!--<type type="UnityTest.ILogger,UnityTest" mapTo="UnityTest.FileLogger, UnityTest" />-->
<type type="UnityTest.ILogger,UnityTest" mapTo="UnityTest.DbLogger, UnityTest" />
</types>
</container>
</containers>
</unity>
</configuration>
日志怎么记录,记录在哪里主程序不关心,他只管调用就可以了,具体的日志实现功能有日志组件模块来完成,可以通过更改配置文件unity来注册使用的日志记录模块
PS:刚开始接触这种模式时觉得跟反射很相像,后来经过理解发现:
•反射是在运行时的动态调用。
•注入依赖是在编译时(即时编译)根据配置文件,采用继承机制把调用者类重新进行封装,重构一个调用者类的子类,把依赖关系通过构造函数的方法设置直接注入到父类,仅在配置文件变更时,才实现类的生成、编译等工作,以后在运行期间直接调用Class文件即可
http://www.cnblogs.com/ejiyuan/archive/2010/04/09/1708289.html