一、 注册服务到依赖注入容器
在 ASP.NET Core 应用中,首先需要将服务注册到依赖注入容器中。可以在 Startup.cs
中的 ConfigureServices
方法中进行注册。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>(); // 注册服务
services.AddControllers().AddDynamicApiControllers(); // 注册动态 WebAPI 控制器
}
这里 IMyService
是服务接口,MyService
是其实现类。
二、在动态 WebAPI 类中使用构造函数注入
动态 WebAPI 类实现 IDynamicApiController
接口,可以在该类的构造函数中直接注入依赖的服务。
using Furion.DynamicApiController;
namespace MyApp.Application
{
public class MyDynamicApiService : IDynamicApiController
{
private readonly IMyService _myService;
// 构造函数注入 IMyService
public MyDynamicApiService(IMyService myService)
{
_myService = myService;
}
public string Get()
{
// 使用注入的服务
return _myService.DoSomething();
}
}
}
在上面的代码中,MyDynamicApiService
通过构造函数接收了一个 IMyService
类型的依赖项。ASP.NET Core 的依赖注入框架会自动创建 MyDynamicApiService
实例,并将 IMyService
的实现传递给构造函数。
三、服务实例的生命周期
在 ConfigureServices
方法中注册服务时,可以指定服务的生命周期:
-
AddTransient
:每次请求都会创建一个新的服务实例。 -
AddScoped
:在同一个 HTTP 请求内使用相同的服务实例。 -
AddSingleton
:应用程序中始终使用同一个服务实例。
四、工作原理
-
注册服务:ASP.NET Core 通过
ConfigureServices
注册所有需要的服务到依赖注入容器中。 -
实例化控制器:当框架需要创建一个
IDynamicApiController
实现类的实例时,依赖注入容器会查看该类的构造函数,并自动为其提供所有需要的依赖项。 -
构造函数注入:框架在实例化类时,通过构造函数注入将所需的依赖项传递给类的构造函数。这使得类可以使用这些依赖项,而无需手动创建它们。
五、使用优势
-
松耦合:构造函数注入使得类之间的依赖关系更为明确,减少了类之间的耦合。
-
可测试性:通过注入依赖项,可以轻松替换这些依赖项为模拟对象,从而更容易进行单元测试。
-
灵活性:可以根据不同的注册生命周期控制服务实例的创建和销毁时机。