天天看点

ASP NET MVC CORE 看官方文档学习随笔--依赖关系注入

ASP NET MVC Core中依赖注入

1、构造函数注入行为(Controller层)

注意:

构造函数必须是公共的,否则引发InvalidOperationException

构造函数注入要求只存在一个适用的构造函数。 支持构造函数重载,但其参数可以全部通过依赖注入来实现的重载只能存在一个。 如果存在多个,应用程序将引发 InvalidOperationException 异常

// throws InvalidOperationException: Unable to resolve service for type 'System.String'...
public CharactersController(ICharacterRepository characterRepository, string title)
{
    _characterRepository = characterRepository;
    _title = title;
}

// runs without error
public CharactersController(ICharacterRepository characterRepository, string title = "Characters")
{
    _characterRepository = characterRepository;
    _title = title;
}
           

2、注册服务

注册数据上下文服务代码

services.AddTransient<IServiceName, ServiceName>();
services.AddScoped<IServiceName, ServiceName>();
services.AddSingleton<IServiceName, ServiceName>();
           

三个注册方式的对象生命周期有区别

transient是临时的:每个控制器和每项服务提供一个新的实例。

scoped是域有效:对象在请求内是相同的,但在不同的请求中是不同的。

singleton是单例:每个对象每个请求都是相同的。

完成上述两个步骤,其实已经完成了依赖注入

以下面代码做一个简要示例

(1)、代码结构

ASP NET MVC CORE 看官方文档学习随笔--依赖关系注入

2、接口+实现类

//接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace DenpendencyInjectionExample.Interfaces
{
    public interface ITest
    {
        
    }
}
           
//实现类
using DenpendencyInjectionExample.Interfaces;
using System;

namespace DenpendencyInjectionExample.Models
{
    public class Test : ITest
    {
        public string Name
        {
            get { return "JiaoLong:" + Guid.NewGuid().ToString(); }
        }
    }
}
           

视图代码

@using DenpendencyInjectionExample.Interfaces
@model DenpendencyInjectionExample.Models.Test

@{
    ViewData["Title"] = "Index";
}

<h2>@Model.Name</h2>
           

运行代码效果如图

ASP NET MVC CORE 看官方文档学习随笔--依赖关系注入

(1)、startup.cs中的ConfigureServices函数中,进行了服务注册,告知了容器ITest与Test的关系,当需要ITest实例的时候,会自动根据该关系生成Test对象给予ITest对象。

(2)、地址中输入地址回车的时刻,路由定位到对应的控制器,默认调用控制器类的构造函数,根据依赖关系自动生成真实所需的对象实体,然后调用了默认的Index类返回给View,View渲染出页面效果。