天天看点

Abp中使用Scope生命周期类处理业务

在默认的Abp中,使用生命周期使用ITransientDependency和ISingletonDependency来自动注入,也可以调用IocManager手动注入.

当我们需要使用Scope作用域生命周期时,就需要手动注入了.下面给出案例:

在模块的Module类的Initialize方法中.添加如下代码:

IocManager.IocContainer
                .Register(Component.For<MyScopeClass>().LifestyleScoped());
           

将MyScopeClass类注入成 Soped生命周期

使用时,不要通过构造函数中或者属性注入该类,在你需要的方法中使用IocManager去获取.

所依赖MyScopeClass类的业务类,也需要重新去Ioc中获取.贴出代码如下:

public class MyScopeClass
{

}

public class AManager
{
    public readonly MyScopeClass _myScope;

    public AManager(MyScopeClass myScope)
    {
        _myScope = myScope;
    }
}
public class BManager
{
    public readonly MyScopeClass _myScope;

    public BManager(MyScopeClass myScope)
    {
        _myScope = myScope;
    }
}

public class TestManager
{
    public MyScopeClass MyScopeClass { get; set; }//× 不要用属性注入

    public TestManager(MyScopeClass myScopeClass)//× 不要用构造函数注入
    {
        
    }

    public void Test()
    {
        using var beginScope = IocManager.Instance.IocContainer.BeginScope();//先开启一个Scope域,这样该方法下依赖的MyScopeClass就为同一个对象了
        var myClass = IocManager.Instance.Resolve<MyScopeClass>();
        var aManager = IocManager.Instance.Resolve<AManager>();
        var bManager = IocManager.Instance.Resolve<BManager>();
        var isSame = aManager._myScope == bManager._myScope;//isSame= true;
    }
}
           

关键的代码就是:开启一个Scope域,该作用域下所依赖MyScopeClass的类,均为同一个.