18 依赖注入之使用依赖注入

在上一篇中,我们讨论了如何在ASP.NET Core中注册服务。服务的注册是依赖注入(DI)过程的第一步,而在本篇中,我们将深入探讨如何在实际应用中使用这些已注册的服务。

什么是依赖注入

依赖注入是将对象的依赖从对象内部移到外部的一种设计模式。在ASP.NET Core中,依赖注入使得组件之间的耦合度降低,提高了代码的可测试性和灵活性。

在使用依赖注入之前,首先需要确保你已经注册了服务。假设在上一篇中,我们注册了一个简单的IMyService接口和它的实现MyService,代码如下:

1
2
3
4
5
6
7
8
9
public interface IMyService
{
string GetGreeting();
}

public class MyService : IMyService
{
public string GetGreeting() => "Hello from MyService!";
}

如上代码中,我们创建了一个简单的服务接口和实现。

使用依赖注入

在ASP.NET Core中,使用依赖注入非常简单。你可以在需要使用这个服务的地方请求它。在ASP.NET Core中,通常是在控制器、Razor页面或中间件中进行注入。

1. 在控制器中使用依赖注入

下面是一个使用了IMyService服务的控制器示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller
{
private readonly IMyService _myService;

public HomeController(IMyService myService)
{
_myService = myService;
}

public IActionResult Index()
{
var greeting = _myService.GetGreeting();
ViewData["Greeting"] = greeting;
return View();
}
}

在上面的代码中,我们在HomeController的构造函数中通过依赖注入将IMyService的实例传递到控制器的私有变量_myService中。接着,在Index方法中,我们可以使用这个服务来获取问候信息。

2. 在Razor页面中使用依赖注入

与控制器类似,你也可以在Razor页面中使用依赖注入。例如,修改Index.cshtml.cs代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using Microsoft.AspNetCore.Mvc.RazorPages;

public class IndexModel : PageModel
{
private readonly IMyService _myService;

public string Greeting { get; private set; }

public IndexModel(IMyService myService)
{
_myService = myService;
}

public void OnGet()
{
Greeting = _myService.GetGreeting();
}
}

这里我们在IndexModel中通过构造函数注入了IMyService,并在OnGet方法中调用它以提供数据。

测试依赖注入

使用依赖注入的另一个好处是,你可以轻松地进行单元测试。下面是一个简单的HomeController的测试示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using Microsoft.AspNetCore.Mvc;
using Moq;
using Xunit;

public class HomeControllerTests
{
[Fact]
public void Index_ReturnsViewWithGreeting()
{
// Arrange
var mockService = new Mock<IMyService>();
mockService.Setup(s => s.GetGreeting()).Returns("Test Greeting");
var controller = new HomeController(mockService.Object);

// Act
var result = controller.Index() as ViewResult;

// Assert
Assert.NotNull(result);
Assert.Equal("Test Greeting", result.ViewData["Greeting"]);
}
}

在这个测试中,我们使用了Moq库来创建IMyService的一个模拟(mock)实例。这样可以保证在测试中不会依赖于真实的服务实现,从而提高测试的隔离性和稳定性。

总结

在本篇中,我们讨论了如何在ASP.NET Core应用程序中实际使用依赖注入。我们从控制器和Razor页面的使用示例出发,展示了如何通过构造函数注入获取服务并使用它们。通过依赖注入,我们提高了代码的可维护性和可测试性。

在下一篇中,我们将继续讨论如何使用Entity Framework Core进行数据访问,敬请期待!

18 依赖注入之使用依赖注入

https://zglg.work/aspnet-core-zero/18/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论