Unity依赖注入容器的应用

定义:Unity Application Block (Unity)是一个轻量级、可扩展的依赖注入容器,所谓依赖注入容器,即组件之间的依赖关系由容器在运行期决定,容器动态的将某种依赖关系注入到组件之中,实现构建高度松耦合的软件的工具,依赖注入容器处理相互关联组件的所有细节,因此你可以构建一个独立的组件,提升组件重用的概率,为系统搭建一个灵活、可扩展的平台。

功能:它有助于构建松耦合的应用程序和为开发者提供以下便利:
1,它提供了创建(或者装配)对象实例的机制,简化对象的创建,特别在分层对象结构和依赖的情形下
2,它支持需求的抽象化,这允许开发人员在运行时或在配置文件中指定依赖,简化横切关注点(crosscutting concerns)的管理
3,它通过把组件配置推给容器来决定,增加了灵活性
4,服务定位能力;这使客户端能够存储或缓存容器

说明:其实说的白一点Unity是一个用来构建插件式系统的解决方案,我们的应用程序有各个功能模块组件组成,各个组件通过依赖关系与系统高度松耦合。在开发程序时只预留接口,让组件来继承这些接口实现功能,具体怎么实现的应用程序不管,有组件负责,应用程序只管调用接口,完成功能。

实例:下面的例子会让我们对Unity依赖注入容器有所了解

需求是这样的,我们的应用程序有一个日志模块,根据不同的需求和部署,我们来可能会把日志记录在不同的地方,如:文本、数据库。。。

1,定义日志接口类:

    public interface ILogger
    {
        
bool Append(string s);
    }

 

 2,记录日志到文本 实现类ILogger接口

代码
    /// <summary>
    
/// 记录日志到文本中
    
/// </summary>
    public class FileLogger : ILogger
    {
        
public bool Append(string s)
        {
            
//代码部分省略
            throw new NotImplementedException();
        }
    }

 

3,记录日志到数据库 实现类ILogger接口

代码

    /// <summary>
    
/// 记录日志到数据库中
    
/// </summary>
    public class DbLogger : ILogger
    {
        
public bool Append(string s)
        {
            
//代码部分省略
            throw new NotImplementedException();
        }
    }

 

4,调用

代码
   class Program
    {
        
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,配置信息

代码
<configuration>
  
<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

 

posted @ 2010-04-10 00:59  KiNg.JiOnG  阅读(502)  评论(0编辑  收藏  举报
查看博客访问人数(点击):