在web api控制器功能裏面我使用了兩種服務,並且因爲他們做獨立的東西我希望他們使用不同的工作單元(交易)。web api控制器和城堡windsor的生活方式
所有必要的組件(工作單元,儲存庫)通過城堡溫莎與LifestylePerWebRequest注射。
從我的理解一個解決方案是使用LifeStyleScoped但我有兩個問題:
- 我想LifeStyleScoped只對這種特殊情況下一般不會
- 我無法找到如何使用一個簡單的例子LifeStyleScoped在控制器內部。
任何其他建議或代碼的例子,將不勝感激。
編輯:我沒有提到的的UnitOfWork沒有在控制器明確注入。控制器中注入兩項服務,這些服務使用通過castle windsor創建的工作單元。
public class SomeController : ApiController
{
private readonly IService _service1;
private readonly IService _service2;
public SomeController (IService service1, IService service2)
{
_service1= service1;
_service2= service2;
}
public IHttpActionResult SomeAction()
{
_service1.DoSomething();
_service2.DoSomething();
}
}
public Service : IService
{
public Service(IUnitOfWork uow) {
}
}
謝謝你的建議和代碼樣本。一旦我重新開始工作(即明天),我會試一試,我會讓你知道那對我有用。 – Khronos
請檢查我的編輯。第二個服務,因爲注入了控制器,已經使用了城堡創建的第一個工作單元。有什麼建議麼? – Khronos
最簡單的解決方案是從構造函數中刪除第二個服務,並在上面的GetService調用中動態檢索它(而不是IUnitOfWork)。或者,如果這不是一次性的要求或要避免的服務定位器,你可以創建一個自定義IScopeAccessor http://docs.castleproject.org/(S(sgex5w45y1suwnquu1b0gd55))/Print.aspx?NS=Windsor&Page=Windsor.Implementing %20custom%20scope&AspxAutoDetectCookieSupport = 1 –