2

我正在用asp.net構建web api,我正在使用UnityContainer處理依賴關係。ASP.NET Web Api依賴注入 - 單例與否

例如,我的身份驗證控制器可依賴於身份驗證服務:

class AuthController : ApiController { 

    private IAuthService authService; 

    public AuthController (IAuthService AuthService) { 
     this.authService = AuthService; 
    } 

    ... 
} 

我的身份驗證服務的實現可以依靠我的用戶信息庫:

class AuthController : IAuthService { 

    private IUserRepository userRepository; 

    public AuthService (IUserRepository UserRepository) { 
     this.userRepository = UserRepository; 
    } 

    ... 
} 

現在,我知道, unity有兩種處理依賴關係的方法,它可以在每次需要時創建依賴項的新實例,或者可以將依賴項的實例保存爲單例,並在每次需要依賴項時注入同一個單例。

默認情況下,unity是第一種方法(每次創建一個新實例)。

我的問題是:我應該保持這種方式,還是應該告訴團結將我的服務和存儲庫保存爲單例?

這個問題真的出現在我的腦海裏,當我的用戶倉庫依賴於其他的依賴關係,並且依賴依賴於用戶倉庫。 當我試圖運行web api時,它會拋出一個堆棧溢出異常,我想它是這樣做的,因爲它每次都必須創建一個新的用戶存儲庫實例和另一個存儲庫。

謝謝 阿里克

+1

您的存儲庫可以作爲一個單身?不知道你的存儲庫是如何實現的,很難說。在嘗試使它成爲單例之前,我會解決循環依賴問題。 – Nick

+0

您需要爲每個請求創建一個新實例。 – Jasen

+0

雅,首先修復你的循環依賴。我只會使用單例的唯一原因是跟蹤我不想丟失的狀態(例如:IsAuthenticated)。 – vidalsasoon

回答

1

創建了一套新的每HttpRequest的情況下,很可能你想要什麼。這可以防止某些意想不到的副作用在某個實例中被緩存時混亂了某些邏輯。如果您將其範圍限定在HttpRequest級別,並且依賴鏈在不同時間依賴於某個存儲庫,則它們將共享該存儲庫的同一個實例。

這裏是你如何能做到在統一:MVC, EF - DataContext singleton instance Per-Web-Request in Unity

1

你不應該使用單對的DbContext。您可以使用每個httprequest生命週期或每個解決生命週期。要添加每個請求生命週期,您可以使用nuget包Unity.WebAPI

+0

但是'DbContext'不應該作爲依賴注入到構造函數中。您解決的對象圖應完全由組件(包含應用程序行爲的類)組成,它們通常應該是無狀態的。 'DbContext'既不是:它不包含應用程序行爲,僅僅是一個大的特定於請求的狀態包。與其他注入DbContext一樣,您應該像處理所有其他狀態一樣將它傳遞給對象圖。有多種方法可以做到這一點,例如使用具有'CurrentContext'屬性的'IDbContextProvider'抽象或使用'IUnitOfWork'。 – Steven

+0

只需注入工廠Func 。註冊DbContext時,Unity可以做到這一點。 –

+0

Func 當然是好的;這將確保它不是對象圖的一部分。 – Steven