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封装到一个单列类中
-
/// <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>();