微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dotnet Core依赖注入

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 IMyDependency
2 {
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.Log@R_901_4045@ion(
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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐