Asp.net core中依赖注入的实现

2022-11-13 11:11:28 依赖 注入 ASP

使用服务

ASP.net core的Controller中,可以通过如下两种方式获取系统注入的服务:

构造函数

可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式。

public ValuesController(IConfiguration cfg)
{
    //…
}

FromService参数

也可以直接在参数中通过FromServiceAttribute引入服务,这个在Controller中用起来非常方便,可以不用再构造函数中加一个变量以保存服务。

[HttpGet]
public string Get([FromServices] IConfiguration cfg)
{
    //…
}

注入服务

如果要注入我们自己的服务,可以通过如下几步实现:

定义服务接口

在DI框架中,服务一般是面向接口实现的,首先需要定义我们服务的接口:

public interface IMyLogger
{
    void WriteMessage(string message);
}

虽然接口定义本身并不是必须的,我们的应用也可以直接依赖于具体的服务对象。但基于良好的设计原则,最好定义接口。

编写服务实现

定义完服务后,就需要编写服务的实现。

public class MyLogger : IMyLogger
{
    public void WriteMessage(string message)
    {
        Console.WriteLine(message);
    }
}

注入服务

注入服务一般是通过IServiceCollection.Add方法来实现的。在asp.net core中,一般有如下两个入口可以注入服务。

  • Startup.ConfigureServices回调函数中注册

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyLogger, MyLogger>();
    services.Addmvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
  • 调用IWEBHostBuilder.ConfigureServices方法注册

一般会在Main函数中创建WebHost,此时可以主动注册服务。

WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(service => service.AddScoped<IMyLogger, MyLogger>())
    .UseStartup<Startup>();

我这里并没有直接使用IServiceCollection.Add方法注册,而是调用的IServiceCollection.AddScoped扩展方法,它简化了我们服务注册的过程。这个方法有三个:

  • AddTransient

  • AddScoped

  • AddSingleton

这三个方法使用方式类似,它们主要的区别是代表了不同的生命周期:

  • 暂时(Transient) - 每次调用都会创建新实例

  • 作用域(Scoped) - 在调用方生命周期类保持相同实例。(如同一个Controller对象在构造函数中和参数中引入的Scoped对象是相同的)

  • 单例(Singleton) - 在Host内保持唯一

系统自带服务

Asp.Net Core程序启动的时候,默认就注入了一系列服务

  • Microsoft.Aspnetcore.Hosting.Builder.IApplicationBuilderFactory

  • Microsoft.AspNetCore.Hosting.IApplicationLifetime

  • Microsoft.AspNetCore.Hosting.IHostingEnvironment

  • Microsoft.AspNetCore.Hosting.IStartup

  • Microsoft.AspNetCore.Hosting.IStartupFilter

  • Microsoft.AspNetCore.Hosting.Server.IServer

  • Microsoft.AspNetCore.Http.IHttpContextFactory

  • Microsoft.Extensions.Logging.ILogger<T>

  • Microsoft.Extensions.Logging.ILoggerFactory

  • Microsoft.Extensions.ObjectPool.ObjectPoolProvider

  • Microsoft.Extensions.Options.IConfigureOptions<T>

  • Microsoft.Extensions.Options.IOptions<T>

  • System.Diagnostics.DiagnosticSource

  • System.Diagnostics.DiagnosticListener

这些服务我们可以直接通过注入的方式使用。另外,一些框架级别的服务(如IServiceProvider,IConfiguration,ILogger<T>等)也是默认可以使用的。

服务容器接口

除了在构造函数中自动获取服务外,我们还可以使用服务容器框架的api构建更为高级的操作,它一般需要用到如下对象:

  • IServiceProvider 可以在实例中通过依赖注入的方式获取

  • ActivatorUtilities 辅助构建任务实例

一个简单的示例如下:

using (var scope = services.CreateScope())
{
    var service = scope.ServiceProvider.GetRequiredService<IMyLogger>();
    service.WriteMessage("hello world");
}

这种方式在asp.net core并不常用,因为系统的Web框架已经为我们处理好了大部分功能,但在我们使用通用主机构建自己的后台应用时,这些API就大有用武之地了,限于篇幅这里就不详细介绍了。

.net core程序中使用

这个依赖注入框架本身并不是.net core的一部分,要在.net core程序中使用它,可以参考我的另一篇文章: .net core程序中使用微软的依赖注入框架。

参考文章

在 ASP.NET Core 依赖注入

到此这篇关于Asp.net core实现依赖注入的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

相关文章