Unity依赖注入

 

一、简介

     Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实现非常松散的耦合设计。

二、使用

1、安装 Unity插件。

     进入NuGet,输入Unity。在相应的项目安装。

     

 

2、config中代码配置。

    

在configSections中加入
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  
在configuration中加入
  <unity  xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container>
      <register type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" />
    </container>
  </unity>
注意: type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" 
         testunity.Models.IBook是命名空间加类名
         testunity是程序集的名称

 

3、把container封装到一个单列类中

  1. /// <summary>
    /// 依赖注入对象
    /// </summary>
    public class DIEntity:IDisposable
    {

    private static readonly DIEntity instance;

    private IUnityContainer container;

    /// <summary>
    /// 单例私有静态锁
    /// </summary>
    private static object unityLock = new object();


    private DIEntity()
    {
    //注入配置对象
    UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);
    container = new UnityContainer();
    section.Configure(container, "unityContainer");
    }

    /// <summary>
    /// 单例
    /// </summary>
    public static DIEntity Instance
    {
    get
    {
    if (instance == null)
    {
    lock (unityLock)
    {
    if (instance == null)
    {
    return new DIEntity();
    }
    }
    }
    return instance;
    }
    }

    /// <summary>
    /// 获取注入容器
    /// </summary>
    public object GetService(Type serviceType)
    {
    return container.Resolve(serviceType);
    }

    /// <summary>
    /// 获取注入容器
    /// </summary>
    public T GetService<T>()
    {
    return container.Resolve<T>();
    }


    #region 资源释放相关

    /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(this);
    }

    /// <summary>
    /// 释放资源
    /// </summary>
    /// <param name="disposing">是否是释放托管资源</param>
    protected virtual void Dispose(bool disposing)
    {
    //暂不处理非托管资源,因为没有托管资源,这里不管是析构函数还是主动释放,都释放container
    try
    {
    container.Dispose();
    container = null;
    }
    catch (Exception ex)
    {
    throw ex;
    }
    }

    /// <summary>
    /// 析构函数,在对象不可访问时触发
    /// </summary>
    ~DIEntity()
    {
    Dispose(false);
    }

    #endregion
    }

4、使用

     IRoleBll roleBll = DIEntity.Instance.GetService<IRoleBll>();

posted on 2017-05-22 17:17  LuoDad  阅读(289)  评论(0编辑  收藏  举报