在預設的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的類,均為同一個.