2017-05-23 87 views
1

我正在使用Umbraco,其中有很多自定義web API控制器。我想在簡單的注入器中忽略它們,只需手動註冊我自己的web api控制器。在簡單注入器中手動註冊web api控制器

  1. 我是否應該將控制器的生活方式註冊爲臨時或範圍? Web api控制器實現了IDisposable,但是如果我理解正確,簡單的注入器會在使用container.RegisterMvcControllers()時將它們記錄爲瞬態。如果它們在使用web API時也應該是短暫的?如果是這樣,我想我必須壓制一次性警告?

  2. 註冊將如何?如果我只是做一個container.Register<MyController>(Lifestyle.Transient),並且我的控制器注入另一個已註冊的接口,即public MyController(IMyRegisteredInterface foo),它將拋出異常​​。

回答

1

我想忽略他們在簡單的注射器,只是手動註冊自己的Web API控制器

你可以很容易忽略他們,同時還通過提供唯一的組件享受批量註冊你希望被掃描到RegisterWebApiControllers方法如下:

container.RegisterWebApiControllers(httpConfiguration, 
    typeof(MyApiController).Assembly); 

應該我將控制者的生活方式註冊爲暫時性或範圍性的?

您可以同時執行這兩個操作,但將它們註冊爲瞬態通常是最簡單的,因爲這樣可以防止它的所有依賴項也應該是Scoped。缺點是,由於ApiController執行IDisposable,這意味着您將不得不壓制DisposableTransientComponent診斷警告。這實際上是Web API的設計缺陷,因爲基類和接口通常應該是而不是實現IDisposable。這個警告可以被抑制,因爲Web API將確保處置。

最簡單的做法是使用RegisterWebApiControllers方法提供的批量註冊功能,因爲它會自動爲您屏蔽此警告。

確保控制器有一個無參數的公共構造函數。

確保你按照Web API Integration Guide,特別是使用SimpleInjectorWebApiDependencyResolver;它將確保控制器通過簡單注射器解決。

+0

Aaah,謝謝!我錯過了'SimpleInjectorWebApiDependencyResolver' :)。我想這是適用於MVC的'SimpleInjectorDependencyResolver',以及用於並行web api的'SimpleInjectorWebApiDependencyResolver'? – filur

+1

@filur:你真的沒有選擇。這兩個框架都需要自己的鉤子來解決他們自己的一組Controller實例。 – Steven