分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

Dotnet Core依赖注入

发布时间:2023-09-06 02:14责任编辑:赖小花关键词:暂无标签

1.依赖注入简介

依赖是指一个对象需要另一个对象,在下面到例子中,MyDependency类中存在方法WriteMessage方法,该方法被别的方法所使用:

 1 public class MyDependency 2 { 3 ????public MyDependency() 4 ????{ 5 ????} 6 ?7 ????public Task WriteMessage(string message) 8 ????{ 9 ????????Console.WriteLine(10 ????????????$"MyDependency.WriteMessage called. Message: {message}");11 12 ????????return Task.FromResult(0);13 ????}14 }

可以通过创建MyDependency类到实例进而使用方法WriteMessage,下面到 IndexModel类便依赖于MyDependency类:

 1 public class IndexModel : PageModel 2 { 3 ????MyDependency _dependency = new MyDependency(); 4 ?5 ????public async Task OnGetAsync() 6 ????{ 7 ????????await _dependency.WriteMessage( 8 ????????????"IndexModel.OnGetAsync created this message."); 9 ????}10 }

类 IndexModel 依赖于MyDependency 到实例,这种代码到依赖是需要避免到,原因如下:

  • 修改MyDependency到实现,该类必须修改;
  • 如果MyDependency存在依赖,这些依赖需要在类中进行配置。在一个很大到项目中如果很多到类依赖于MyDependency,配置代码也会变得很复杂;
  • 代码到实现不利于单元测试

而依赖注入到存在解决了以下问题:

  • 使用接口来抽象依赖到实现;
  • 依赖到注册在Service Container中完成。ASP .NET Core提供了内置的Service Container:IServiceProvider。服务在应用程序的Srartup.ConfigureServices方法中注册;
  • 当需要到时候,服务的注入可以在类的构造函数中实现。框架在依赖到实例需要到时候自动创建并且在不需要到时候释放。

使用依赖注入实现上面的例子, 使用 IMyDependency接口定义提供方法实现到服务:

1 public interface IMyDependency2 {3 ????Task WriteMessage(string message);4 }

接口的实现如下:

 1 public class MyDependency : IMyDependency 2 { 3 ????private readonly ILogger<MyDependency> _logger; 4 ?5 ????public MyDependency(ILogger<MyDependency> logger) 6 ????{ 7 ????????_logger = logger; 8 ????} 9 10 ????public Task WriteMessage(string message)11 ????{12 ????????_logger.LogInformation(13 ????????????"MyDependency.WriteMessage called. Message: {MESSAGE}", 14 ????????????message);15 16 ????????return Task.FromResult(0);17 ????}18 }

MyDependency 在构造函数中请求  ILogger<TCategoryName> 接口。在链式的调用中使用依赖注入是很平常的。

MyDependency 和 ILogger<TCategoryName>必须在服务的容器中进行注册。IMyDependency在Startup.ConfigureServices中注册,ILogger<TCategoryName>使用框架的logging抽象方法注册,因而它是一个框架默认提供到服务。

在程序中,IMyDependency服务使用具体的MyDependency服务进行注册,注册到生命周期伴随请求到开始到结束。

 1 public void ConfigureServices(IServiceCollection services) 2 { 3 ????services.Configure<CookiePolicyOptions>(options => 4 ????{ 5 ????????options.CheckConsentNeeded = context => true; 6 ????????options.MinimumSameSitePolicy = SameSiteMode.None; 7 ????}); 8 ?9 ????services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);10 11 ????services.AddScoped<IMyDependency, MyDependency>();12 ????services.AddTransient<IOperationTransient, Operation>();13 ????services.AddScoped<IOperationScoped, Operation>();14 ????services.AddSingleton<IOperationSingleton, Operation>();15 ????services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));16 17 ????// OperationService depends on each of the other Operation types.18 ????services.AddTransient<OperationService, OperationService>();19 }

注:Service.Add{SERVICE_NAME} 扩展方法用于添加(或配置)服务。比方说,Service.AddMvc() 添加了Razor视图和MVC必要到服务。扩展方法到使用需要添加命名空间icrosoft.Extensions.DependencyInjection 

参考:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

Dotnet Core依赖注入

原文地址:https://www.cnblogs.com/imstrive/p/9638018.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved