在默认的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的类,均为同一个.