码迷,mamicode.com
首页 > Web开发 > 详细

Dotnet Core依赖注入

时间:2018-09-13 00:00:51      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:.net core   doc   DDM   class   接口   原因   程序   category   depend   

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.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依赖注入

标签:.net core   doc   DDM   class   接口   原因   程序   category   depend   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!