Unity是什么?
unity是patterns&practices团队开发的一个轻量级、可扩展的依赖注入容器。
Unity特性
1、它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。
2、Unity允许将预先配置的对象注入到类中,实现了inversion of control(Ioc)的功能。在Unity中,支持constructor injection(构造器注入),property setter injection(属性设置值注入)和method call injection(方法注入)。
3、支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。
4、可以通过配置文件进行准备和配置容器。
5、不会影响到类的定义(属性设置值注入和方法注入除外),这也是轻量级容器的一个体现。
6、支持自定义的容器扩展。
Unity实践
新建一个控制台程序,Nuget安装Unity
先写类
/// <summary>
/// 班级接口
/// </summary>
public interface IClass
{
string ClassName {
get; set; }
void ShowInfo();
}
/// <summary>
/// 计科班
/// </summary>
public class CbClass : IClass
{
public string ClassName {
get; set; }
public void ShowInfo()
{
Console.WriteLine("计科班:{0}", ClassName);
}
}
/// <summary>
/// 电商班
/// </summary>
public class EcClass : IClass
{
public string ClassName {
get; set; }
public void ShowInfo()
{
Console.WriteLine("电商班:{0}", ClassName);
}
}
一般初始化实例的时候这样
CbClass cbclass = new CbClass();
使用依赖倒置原则
IClass class = new CbClass();
再建个简单工厂封装一下
var class = Factory.CreateClass();
但类一旦多了以后,每增加类你都得修改工厂,这样就变得很繁杂了,这里使用依赖注入解决这个问题
public static void ContainerCodeTest1()
{
IUnityContainer container = new UnityContainer();
//默认注册(无命名),如果后面还有默认注册会覆盖前面的
container.RegisterType<IClass, CbClass>();
//命名注册
container.RegisterType<IClass, EcClass>("ec");
//解析默认对象
IClass cbClass = container.Resolve<IClass>();
cbClass.ShowInfo();
//指定命名解析对象
IClass ecClass = container.Resolve<IClass>("ec");
ecClass.ShowInfo();
//获取容器中所有IClass的注册的已命名对象
IEnumerable<IClass> classList = container.ResolveAll<IClass>();
foreach (var item in classList)
{
item.ShowInfo();
}
}