天天看點

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

繼續閱讀