控制反转(IOC)与依赖注入(DI)--第三方Autofac的.NET IoC框架使用
一、简介:
1、什么是控制反转(IOC)
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。传统程序设计,我们直接在逻辑层通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;
控制:容器控制资源、数据的获取
反转:容器把依赖对象注入到对象,对象只能被动的接收容器注入的资源等等,这种方式叫做反转
例子:
(1)、传统程序设计如图,都是主动去创建相关对象然后再组合起来:
(2)、当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了:
2、什么是依赖注入(DI)
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
依赖注入:容器把对象或者组件需要的数据等等注入这种形式叫做依赖注入
3、IoC和DI由什么关系呢?
其实它们是同一个概念的不同角度描述
4、优点
灵活性
(1)、可以简单的改变一个广泛使用的接口的实现类
(2)、改变检索策略对于一个给定的类更简单(例如移动服务从类路径的JNDI树)
(3)、 在一个地方调价拦截器是简单的(如添加一个拦截器与基于jdbc的缓存DAO)
可读性
(1)、这些项目有一个统一的组件模型,而不是零散的。
(2)、代码更加简单。
可测试性
(1)、当他们通过构造函数的时候依赖关系很容易取代。
(2)、可维护性比较好并且便于进行单元测试
(3)、更多的测试会导致更高的代码质量
二、Autofac第三方IOC框架:
1、下载Get包
(1)、Autofac (2)、Autofac.Extensions.DependencyInjection
2、命名空间
using Autofac;
3、容器的实现
using Autofac; using System; using Yes.Manage.IService; using Yes.Manage.Service; namespace Yes.Manage.ContainerService { public class Container { private static IContainer container = null;//创建、连接依赖项并管理一组组件的生存期。 public static ILifetimeScope BeginLifetimeScope() { if (container == null) { Initialise(); } return container.BeginLifetimeScope();//通过新作用域创建的组件实例 } public static void Initialise() { //容器构造器 var builder = new ContainerBuilder(); //注册类型等等服务 builder.RegisterType<UserService>().As<IUserService>(); //构造容器 container = builder.Build(); } } }
4、UserService
using Modelsql.DbContexts; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Yes.Manage.IService; namespace Yes.Manage.Service { /// <summary> /// 仓储,用户相关数据操作 /// </summary> public class UserService:IUserService {/// <summary> /// 查询集合 /// </summary> /// <returns></returns> public List<User> list() { return DbContext.User; } } }
5、IUserService
using Modelsql.DbContexts; using System; using System.Collections.Generic; using System.Text; namespace Yes.Manage.IService { public interface IUserService {/// <summary> /// 查询集合 /// </summary> /// <returns></returns> List<User> list(); } }
6、webapi接口
using Autofac; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Modelsql.DbContexts; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using WebAPI.API; using Yes.Manage.ContainerService; using Yes.Manage.IService; using Yes.Manage.Service; namespace iocc.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class DiController : ControllerBase { /// <summary> /// 获取用户集合 /// </summary> /// <returns></returns> [HttpPost] public List<User> Subtract() { ResultMsg resultMsg = new ResultMsg() { StatusCode = 500, Info = "Success", Data = "" }; using (var lifetimeScop = Container.BeginLifetimeScope()) { IUserService userservice = lifetimeScop.Resolve<IUserService>();//检索IUserService服务的上下文获取对应的实例 var user = userservice.list(); return user; } } } }