-1

我已經通讀SimpleInjector文檔幾次。但有幾個問題。適用於WebApi和UnitOfWork的正確SimpleInjector配置

上下文:

  • 3層的應用程序(演示(MVC + API控制器),服務(業務邏輯),數據(存儲庫,實體等)工作的
  • 單位是圍繞EF的薄的包裝器的DbContext
  • 我工作的DbContext和單位註冊PerWebRequest,使用 RegisterWebApiRequest導致異常,因爲工作的單位是用來 以外的Web API請求。
  • 我的MVC和API控制器使用RegisterWebApiControllers(GlobalConfiguration.Configuration)RegisterMvcControllers(Assembly.GetExecutingAssembly())
  • 每個控制器都具有注入其中一個或多個服務註冊。
  • 每個服務都有一個或多個注入其中的存儲庫。
  • 服務也可能注入其他服務。
  • 我想要在我的所有服務/存儲庫中存在相同的工作單元/ DbContext。

問題

  • 因爲我用我的MVC控制器以及API控制器服務;這是否意味着我不能使用RegisterWebApiRequest來代替RegisterPerWebRequest?

  • 沒有我的服務,存儲庫等維護任何狀態,我會使用PerWebRequest與Transient一樣獲得相同的功能;在Transient上使用PerWebRequest有什麼好處嗎?

+0

可能的重複[如何在MVC Web應用程序中使用WebAPI,WCF,SignalR和背景Taks配置簡單注入器容器和lifestylse](http://stackoverflow.com/questions/26433012/how-to-configure-simple -injector-container-and-lifestylse-in-a-mvc-web-app-with) – Steven

回答

1

請仔細閱讀以下問題:How to configure simple injector container and lifestylse in a MVC web app with WebAPI, WCF, SignalR and Background Tasks。答案解釋如下:

  1. 從架構的角度來看,將Web API與MVC控制器放在同一個項目中是一個壞主意。
  2. 但是,如果你想這樣做,你可以在兩種類型的應用程序中使用WebRequestLifestyleWebApiRequestLifestyle是指適用於IIS和自託管環境的Web API的生活方式,但是由於您將Web API控制器放置在同一個項目中,因此您顯然只對IIS託管的項目感興趣;在這種情況下,WebRequestLifestyle將會很好。

因爲我在我的MVC控制器以及API控制器中使用服務;這是否意味着我不能使用RegisterWebApiRequest來代替RegisterPerWebRequest?

兩種生活方式都使用不同的緩存方式。WebRequestLifestyle使用HttpContext.Current.Items詞典來存儲它的SimpleInjector.Scope實例,而WebApiRequestLifestyle使用CallContext類在單個異步操作的生存期內存儲Scope

正如解析Web API控制器時可以使用WebRequestLifestyle一樣,您也可以使用WebApiRequestLifestyle(或底層的ExecutionContextScopeLifestyle)用於MVC控制器。但是如果你想要這個,你將爲MVC創建你自己的IDependencyResolver實現,它將明確地開始和結束一個ExecutionContextScope。存儲在CallContext中的Scope缺失是在使用WebApiRequestLifestyle註冊服務時解決MVC控制器失敗的原因。但是,儘管可以在MVC中使用WebApiRequestLifestyle,但由於不需要自定義代碼,因此其他方面更容易。

沒有我的服務,存儲庫等維護任何狀態,我會使用PerWebRequest作爲Transient獲得相同的功能;在Transient上使用PerWebRequest有什麼好處嗎?

如果服務沒有國家,他們擁有什麼樣的生活方式並不重要。唯一的限制是他們擁有的生活方式等於或長於他們自己的生活方式。違反此限制稱爲Captive Dependencies,並可能導致各種麻煩。由於俘虜依賴性不好,Simple Injector v3會爲您檢查並防止這種情況。

儘管您可以使配置作用域(非瞬態)中的所有對象,使它們瞬變通常更容易配置,並可能導致更好的性能(儘管您可能永遠不會注意到現實生活中的差異)。

+0

我從他們的網站上讀到的大部分內容。你最後一段主要是我想要的。 – sheamus

+0

我的網站爲使用MVC的頁面和使用WebApi的頁面提供數據。你是否認爲把它們放在它自己的DLL中會更好?那麼WebApi數據的所有消費者呢?把它放在MVC項目或WebApi項目中?或者你是否說如果我使用WebApi,我應該從靜態HTML提供我的頁面? – sheamus