依赖注入实现的生命周期分为三种,分别为应用程序生命周期(也称为单例Singleton)、范围内生命周期(Scoped)、瞬时生命周期(Transient)
Singleton,即整个程序的生命周期只生成一个实例,例如
services.AddSingleton<ITestContract,TestService>();
Scoped,即在一个范围内,每次获取到的都是同一个实例,例如
services.AddScoped<ITestContract, TestService>();
Transient,每次获取到的都是一个新的实例,例如
services.AddTransient<ITestContract,TestService>();
我们可以通过模块包的ConfigureServices方法中进行配置
/// <summary>
/// 将模块服务添加到依赖注入服务容器中
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public override IServiceCollection ConfigureServices(IServiceCollection services)
{
services.AddScoped<ITestContract, TestService>();//注入接口与实现类
return services;
}
只需要添加一行代码即可
services.AddScoped<ITestContract, TestService>();//注入接口与实现类
注入业务逻辑代码,通过接口及实现该接口的类进行注入到服务容器中,然后通过构造函数获取到该实现类。
如果您不适应接口的写法,觉的繁琐,您也可以直接注入一个类
services.AddScoped<TestService>();//注入接口与实现类
当你在模块包中配置完成后,那么你就可以直接通过构造函数获取对应的实例
public class Test2Service : ITest2Contract
{
private readonly ITestContract _testContract;
public Test2Service(ITestContract testContract)
{
_testContract = testContract;
}
public void Test()
{
_testContract.DoWork(Guid.NewGuid().ToString());
}
}
你也可以通过扩展方法,这样写
public class Test2Service : ITest2Contract
{
private ITestContract TestContract { get; }
public Test2Service(IServiceProvider provider)
{
TestContract = provider.GetService<ITestContract>();
}
public void Test()
{
TestContract.DoWork(Guid.NewGuid().ToString());
}
}