zoukankan      html  css  js  c++  java
  • 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来注册使用的日志记录模块

  • 相关阅读:
    AxWindowsMediaPlayer的详细用法
    C# 播放器控件的常用方法
    在 C# 中使用文件名启动应用程序
    备份和恢复Android手机的NAND分区
    刷Recovery的方法
    WPF RadioButton的探究,为啥选中一个其他都自动不选中了呢?
    WPF大牛Josh Smith 转投 iOS 的怀抱
    终端服务的剪贴板的缺陷,导致WPF调用Clipboard.SetText() 失败
    用df命令查看分区情况
    WPF与输入法冲突研究之二:TextInput事件的BUG?
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/1708289.html
Copyright © 2011-2022 走看看