依赖注入实现的生命周期分为三种,分别为应用程序生命周期(也称为单例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());
        }
    }