版权声明:本文为博主原创文章,未经博主允许不得转载。 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渲染出页面效果。