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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshineyang1205/article/details/80497557

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)、代码结构
代码结构

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>

运行代码效果如图
运行效果

(1)、startup.cs中的ConfigureServices函数中,进行了服务注册,告知了容器ITest与Test的关系,当需要ITest实例的时候,会自动根据该关系生成Test对象给予ITest对象。
(2)、地址中输入地址回车的时刻,路由定位到对应的控制器,默认调用控制器类的构造函数,根据依赖关系自动生成真实所需的对象实体,然后调用了默认的Index类返回给View,View渲染出页面效果。

猜你喜欢

转载自blog.csdn.net/sunshineyang1205/article/details/80497557