IoC:unity的简单应用

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();
    }
}

猜你喜欢

转载自blog.csdn.net/dingmengwei/article/details/114205021