依赖注入

简单介绍

Scorpio 的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的文档在 Scorpio 中也是有效的。

Scorpio 框架没有对任何第三方DI提供程序的核心依赖, 但您可以使用一个提供程序来支持动态代理(dynamic proxying)和一些高级特性以便 Scorpio 的部分模块能正常工作。我们已经为您提供了 AspectCore 的实现, 更多信息请参阅 Aspect 文档。

模块化注入

因为 Scorpio 是一个模块化框架,因此每个模块都定义它自己的服务并在它自己的单独模块类中通过依赖注入进行注册.例:

public class StartupModule:ScorpioModule
{
    public override void ConfigureServices(ConfigureServicesContext context)
    {
        //在这里添加依赖注入代码。
    }
}

依照约定的注册

Scorpio 引入了依照约定的服务注册.依照约定你只需要调用 ServicesCollection.RegisterAssemblyByConvention()方法 ,它会自动完成服务的注册。

public class StartupModule:ScorpioModule
{
    public override void ConfigureServices(ConfigureServicesContext context)
    {
        context.Services.RegisterAssemblyByConvention();
    }
}

依赖接口

如果实现这些接口,则会自动将类注册到依赖注入:

  • ITransientDependency 注册为transient生命周期.
  • ISingletonDependency 注册为singleton生命周期.
  • IScopedDependency 注册为scoped生命周期.

示例:

public class TaxCalculator : ITransientDependency
{
}

TaxCalculator因为实现了ITransientDependency,所以它会自动注册为transient生命周期。

ExposeServices 特性

ExposeServicesAttribute用于控制相关类提供了什么服务及生命周期。例:

[ExposeServices(typeof(ITaxCalculator))]
public class TaxCalculator: ICalculator, ITaxCalculator, ICanCalculate, ITransientDependency
{

}

TaxCalculator类只公开ITaxCalculator接口.这意味着你只能注入ITaxCalculator,但不能注入TaxCalculatorICalculator到你的应用程序中。

ReplaceService 特性

ReplaceServiceAttribute 用于控制是否替换之前的注入的服务,使用 IServiceCollectionReplace 扩展方法。

依照约定公开的服务

如果你未指定要公开的服务,则 Scorpio 依照约定公开服务.以上面定义的TaxCalculator为例:

默认情况下,类本身是公开的。这意味着你可以按TaxCalculator类注入它。 默认情况下,默认接口是公开的。默认接口是由命名约定确定.在这个例子中,ICalculatorITaxCalculatorTaxCalculator的默认接口,但ICanCalculate不是.

手动注册

在某些情况下,你可能需要向IServiceCollection手动注册服务,尤其是在需要使用自定义工厂方法或singleton实例时.在这种情况下,你可以像Microsoft文档描述的那样直接添加服务.例:

public class StartupModule:ScorpioModule
{
    public override void ConfigureServices(ConfigureServicesContext context)
    {
        context.Services.AddSingleton<TaxCalculator>(new TaxCalculator(taxRatio: 0.18));

        context.Services.AddScoped<ITaxCalculator>(sp => sp.GetRequiredService<TaxCalculator>());
    }
}

第三方提供程序

虽然 Scorpio 框架没有对任何第三方DI提供程序的核心依赖, 但它必须使用一个提供程序来支持动态代理(dynamic proxying)和一些高级特性以便部分 Scorpio 特性能正常工作.

我们已经为您实现了AspectCore的集成.如果您需要使用,您可以在构建 Bootstrapper 时使用 BootstrapperCreationOptions.UseAspectCore 方法来集成 AspectCore.

如果您需要集成其他的提供者,您可以实现 IServiceProviderFactory<TContainerBuilder> 接口并在创建 Bootstrapper 时使用 BootstrapperCreationOptions.UseServiceProviderFactory<TContainerBuilder> 方法注入您的提供者.