控制反转(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;
            }
        }
    }
}

 

 

 

 

posted @ 2022-04-06 11:58  猴猴手记  阅读(156)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end