雪花

IOC容器

IOC容器(控制反转)是一种思想,Autofac是一款IOC框架,Autofac的反射dll

ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方法如下

在start.up类中ConfigureServices方法对实例进行注册

services.AddTransient<IApplicationService,ApplicationService>();
services.AddSingleton<IApplicationService,ApplicationService>(); 
services.AddScoped<IApplicationService,ApplicationService>();

这三个方法都是将我们实例注册进去,只不过是生命周期不一样。

AddSingleton:整个应用程序生命周期以内只创建一个实例,相当于一个静态类。

AddScoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)。

AddTransient:每一次都会创建一个新的实例。

 

PS:本demo将主要采用构造函数注入的方式。

约定:

1、仓储层接口都以“I”开头,以“Repository”结尾。仓储层实现都以“Repository”结尾。

2、服务层接口都以“I”开头,以“Service”结尾。服务层实现都以“Service”结尾。

一、示例

1、新建解决方案,并初始化默认访问路由

 2、创建自己服务

 3、将自己的服务注入

 4、使用

 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace IOCTest.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly ITestService _testService;
        public HomeController(ITestService testService)
        {
            _testService = testService;
        }
        // GET: api/<controller>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            var str = _testService.GetName();

            return new string[] { "value1", "value2", str };
        }
    }
}

 注意:

IOC的<接口,方法的>绑定解决耦合度

二、第二种写法

1、新增依赖注入类DIIoc

代码如下:

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace IOCTest
{
    public class IService
    {
    }
    public interface ITestService
    {
        string GetName();
    }
    public class TestService : ITestService
    {
        public string GetName()
        {
            return "功能点1";
        }
    }
    /// <summary>
    /// DI依赖注入
    /// </summary>
    public class DIIoc
    {
        /// <summary>
        /// IServiceCollection  类型是 using Microsoft.Extensions.DependencyInjection;
        /// </summary>
        /// <param name="services"></param>
        public static void Injection(IServiceCollection services)
        {
            //Transient:每一次调用服务都会创建一个新的实例
            //Scoped:每一次请求只创建一个实例
            //Singleton :单例,在整个应用程序生命周期以内只创建一个实例
            services.AddScoped<ITestService, TestService>();
        }
    }
}

2、 在StartUp.cs中添加服务

3、运行效果

 三、注入自身类型

参考

1、更改注入自身类型

 

 并添加到服务

//添加服务
DIIoc.Injection(services);

2、访问

 

posted @ 2020-01-02 09:43  十色  阅读(358)  评论(0编辑  收藏  举报