文章https://www.codeproject.com/Articles/1080517/Aspect-Oriented-Programming-using-Interceptors-wit的作者正在解釋如何在「ASPNET Boilerplate」框架中創建攔截器。在我的情況下,我想創建一個攔截器(或兩個攔截器,一個用於開始,另一個用於結束),它將包裝Unit of Work
。當任何AppService
中的方法啓動時,我需要調用一個名爲spStart
的存儲過程,並在調用數據庫時調用spEnd
。由於在ABP的Unit of Work
也是一個攔截器,這是我迄今所做的: 按照我提供上面的鏈接的文章中的步驟,我做了以下內容:如何在ABP框架中用攔截器包裹工作單元
- 增加了兩個攔截器:
StartInterceptor
和EndInterceptor
與 他們Registrar
類 - 註冊他們在
ApplicationModule
類 另外在
ApplicationModule
我添加以下代碼:IocManager.IocContainer.Register(Component.For<IApplicationService>() .Interceptors(InterceptorReference.ForType<StartInterceptor>()).First, Component.For<StartInterceptor>() .Interceptors(InterceptorReference.ForType<EndInterceptor>()).Last, Component.For<StopInterceptor>());
此代碼應使StartInterceptor
運行第一和EndInterceptor
最後運行。考慮到工作單元攔截器將介於兩者之間,並且我們將使用邏輯來等待截獲的異步方法返回結果,這應該會讓我們選擇包裝工作單元。然而,這是發生的事情:當spStart
運行時,一切都很好。該存儲過程在Unit of Work攔截器之前運行,因此在那裏沒有問題。然而,當spEnd
運行時,它表示「事務應在連接可用於執行SQL語句之前處理」或「該操作對於事務狀態無效」......似乎UoW與我的存儲過程。有沒有其他人與ABP有同樣的問題?你是如何解決它的?
它的工作!謝謝。 – John