使用 Asp.net core 的示例
录制视频链接:https://www.youtube.com/watch?v=oVj1IHw8GLU
OverviewOfDI:https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core 支持依赖注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现控制反转 (IoC) 的技术。
通过IoC容器,我们可以实现
在Asp.net core中,IoC容器有内置的接口。
以下 DI 生命周期将是
ASP.NET Core 中基本上有两种类型的服务:
框架服务:属于 ASP.NET Core 框架一部分的服务,例如 IApplicationBuilder、IHostingEnvironment、ILoggerFactory 等。
应用程序服务:您作为程序员为应用程序创建的服务(自定义类型或类)。
Asp.Net Core MVC 控制器通过构造函数显式请求依赖项 1. 构造函数注入 2. 方法注入(操作级别) 3. 属性注入(不支持) 4. 视图注入
构造函数注入: - 服务作为构造函数参数添加,运行时从服务容器(IServiceCollection - DiContainer)解析服务。服务a通常使用非具体类(接口)来定义
方法注入: - 使用 [FromService] 属性可以将服务直接注入到操作方法中,而无需使用控制器注入
属性注入 目前(Asp.net core)内置 IOC 容器不支持属性注入。为此,您可以使用第三方内置服务容器(IOC)。
视图注入使用 [Inject] 指令可以将服务直接注入视图页面,而无需使用控制器或方法注入
内置的IoC容器支持三种生命周期:
在示例中,“IMyDependency”服务接口定义了“WriteMessage”方法
public interface IMyDependency
{
void WriteMessage(string message);
}
该接口由具体类型 MyDependency 实现:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
现在,使用具体类型“MyDependency”注册“IMyDependency”服务(在startup.cs中)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
这里“IServiceCollection”实例的 Add() 方法用于向 IoC 容器注册服务。 “ServiceDescriptor”用于指定服务的类型和具体实现。这将在容器中注册我们的服务,默认为“Singleton”
现在,让我们注入不同生命周期的服务
Singleton(用例:当我们需要创建状态服务时):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
瞬态(用例:当我们需要创建无状态服务时):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
范围(用例:数据库服务):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
我们还可以使用内置扩展方法注入服务
辛格尔顿
services.AddSingleton
瞬态
services.AddTransisent
范围
services.AddScoped
公共类 HomeController : 控制器 { 私有只读 IMyDependency _service;
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
公共类 HomeController : 控制器 {
public IActionResult Index()
{
return View();
}
}
在 Index.cshtml 中
@{ ViewData["标题"] = "首页"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
公共类 HomeController : 控制器 {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}