该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

IOC 与 DI

基本概念

  • 什么是 IOC

    Inversion Of Control ,即控制反转 , 是一种编程思想,将对象的创建、销毁等任务交给 IOC 容器来完成,而不需要程序手动创建和销毁.

  • IOC 实现方式

    • DI 依赖注入
    • DL 依赖查找
  • DI

    Dependency Injection , 即依赖注入,是一种实现 IOC 的技术,将所依赖对象的创建、销毁和依赖关系交给外部的 IOC 容器来管理,从而实现对象之间解耦

  • IOC 与 DI 意义

    • 解耦
    • 代码灵活
    • 易于扩展
    • 提高可测试性
  • DI 方式

    • 构造函数注入
    • 属性注入
    • 方法注入
  • 常用的 IOC 容器

    • Unity
    • Autofac
    • Ninject
    • Simple Injector

示例

  • 不使用 IOC 和 DI

    • 数据访问层: IStudentDAL 和 StudentDAL
    // IStudentDAL 
    public interface IStudentDAL
    {
    	public void Create();
    }
    
    // StudentDAL
    
    public class StudentDAL : IStudentDAL
    {
    	public void Create()
    	{		
            Console.WriteLine("DAL-访问数据库,实现学员信息添加操作");
    	}
    }
    
    
    • 业务逻辑层: IStudentBLL 和 StudentBLL
    
    // IStudentDAL 
    public interface IStudentBLL
    {
    	public void Create();
    }
    
    // StudentDAL
    public class StudentBLL : IStudentBLL
    {
    	private IStudentDAL studentDAL = new StudentDAL();
    	public void Create()
    	{
    		this.studentDAL.Create();
    		Console.WriteLine("BLL-通过调用StudentDAL实现学员添加操作");
    	}
    }
    
    • 入口
    static void Main(string[] args)
    {
    	IStudentBLL studentBLL = new StudentBLL();
    	studentBLL.Create();
    }
    
    
  • 使用 IOC 和 DI

    • 数据访问层: IStudentDAL 和 StudentDAL
    // IStudentDAL 
    public interface IStudentDAL
    {
    	public void Create();
    }
    
    // StudentDAL
    
    public class StudentDAL : IStudentDAL
    {
    	public void Create()
    	{		
            Console.WriteLine("DAL-访问数据库,实现学员信息添加操作");
    	}
    }
    
    
    • 业务逻辑层: IStudentBLL 和 StudentBLL
    // IStudentDAL 
    public interface IStudentBLL
    {
    	public void Create();
    }
    
    // StudentDAL
    public class StudentBLL : IStudentBLL
    {
    	private IStudentDAL studentDAL = new StudentDAL();
    	public void Create()
    	{
    		this.studentDAL.Create();
    		Console.WriteLine("BLL-通过调用StudentDAL实现学员添加操作");
    	}
    }
    
    
    • 入口
    static void Main(string[] args)
    {
    	// IOC 容器
    	ServiceCollection services = new ServiceCollection();
    
    	// DI 依赖注入
    
    	services.AddTransient(typeof(StudentBLL));
    	services.AddTransient<IStudentDAL, StudentDAL>();
    
    	// 通过容器实例化对象
    	ServiceProvider provider = services.BuildServiceProvider();
    	StudentBLL studentBLL = provider.GetService(typeof(StudentBLL)) as StudentBLL;
    	studentBLL.Create();
    
    }
    
    
  • Asp.net MVC 中的应用

    • 数据访问层: IStudentDAL 和 StudentDAL
    // IStudentDAL 
    public interface IStudentDAL
    {
    	public void Create();
    }
    
    // StudentDAL
    
    public class StudentDAL : IStudentDAL
    {
    	public void Create()
    	{		
            Console.WriteLine("DAL-访问数据库,实现学员信息添加操作");
    	}
    }
    
    
    • 业务逻辑层: IStudentBLL 和 StudentBLL
    // IStudentDAL 
    public interface IStudentBLL
    {
    	public void Create();
    }
    
    // StudentDAL
    public class StudentBLL : IStudentBLL
    {
    	private IStudentDAL studentDAL = new StudentDAL();
    	public void Create()
    	{
    		this.studentDAL.Create();
    		Console.WriteLine("BLL-通过调用StudentDAL实现学员添加操作");
    	}
    }
    
    
    • 控制器
    [Route("api/[controller]")]
    [ApiController]
    public class StudentController : ControllerBase
    {
    	private IStudentBLL studentBLL;
    
    	public StudentController(IStudentBLL studentBLL)
    	{
    		this.studentBLL = studentBLL;
    	}
    
    	[HttpPost]
    	[Route("create")]
    	public string Create()
    	{
    		this.studentBLL.Create();
    		return "学生创建成功";
    	}
    }
    
    
    • 入口
    builder.Services.AddSingleton<IStudentBLL, StudentBLL>();
    builder.Services.AddSingleton<IStudentDAL, StudentDAL>();
    
    

    自定义 IOC

    • 自定义特性类, 使用本定制属性时,将会被Ioc扫描,默认进行单实例化
    public class DependenceInjectionAttribute : Attribute
    {
    	public InstanceType InstanceType { set; get; }
    
        public DependenceInjectionAttribute(InstanceType instanceType = InstanceType.SINGLE)
        {
            this.InstanceType = instanceType;
        }
    }
    
    
    
    • 实例化类型
    public enum InstanceType
    {
    	SINGLE,
    	MULTIPLE
    }
    
    
    • IOC 容器类
    public static class IOCHelper
    {
    	/// <summary>
    	/// 容器字典
    	/// </summary>
    	public static Dictionary<Type, object> IocContainer = new Dictionary<Type, object>();
    
    	/// <summary>
    	/// 注册特定类型到IoC容器中
    	/// </summary>
    	/// <param name="type"></param>
    	/// <exception cref="Exception"></exception>
    	public static void Register(Type type)
    	{
    				
    		if (DoSingleInstance(type))
    		{
    
    			//如果该类包含定制的属性且为要求执行单实例,则直接实例化
    
    			var instance = Activator.CreateInstance(type, null);
    
    			if (instance != null)
    			{
    				IocContainer.Add(type, instance);
    			}
    			else
    			{
    				throw new Exception(string.Format("实例化对象{0}失败!", type));
    			}
    		}
    	
    	}
    	/// <summary>
    
    	/// 判断执行单实例化还是多实例化
    
    	/// </summary>
    
    	/// <param name="type"></param>
    
    	/// <returns></returns>
    
    	private static bool DoSingleInstance(Type type)
    	{
    
    		Attribute[] attrs = Attribute.GetCustomAttributes(type);
    		foreach (var attr in attrs)
    		{
    			if (attr is DependenceInjectionAttribute)
    			{
    				var di = (DependenceInjectionAttribute)attr;
    				if (di.InstanceType == InstanceType.SINGLE)
    				{
    					return true;
    				}
    			}
    
    		}
    		return false;
    	}
    	/// <summary>
    
    	/// 实例化:
    
    	///     单实例使用默认构造函数
    
    	///     多实例可以自定义构造函数
    
    	/// </summary>
    
    	/// <typeparam name="T"></typeparam>
    
    	/// <param name="args"></param>
    
    	/// <returns></returns>
    
    	public static T Resolve<T>(params object[] args)
    	{
    		if (DoSingleInstance(typeof(T)))
    		{
    			if (IocContainer.ContainsKey(typeof(T)))
    
    				return (T)IocContainer[typeof(T)];
    		}
    		else
    		{
    			return (T)Activator.CreateInstance(typeof(T), args);
    		}
    
    		return default(T);
    
    	}
    
    }
    
    • 业务类
    [DependenceInjectionAttribute()]
    public class Student
    {
    	public void SayHi() {
            Console.WriteLine("Hi");
    	}
    }
    
    
    • 测试类
    static void Main(string[] args)
    {
    	// 注册依赖注入类型
    	IOCHelper.Register(typeof(Student));
    	// 通过容器实例化对象
    	var student = IOCHelper.Resolve<Student>();
    	// 测试方法
    	student.SayHi();
    }
    
    

空文件

简介

暂无描述 展开 收起
C#
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化