Внутри функции контроллера api для веб-приложений я использую две службы, и поскольку они делают независимые вещи, я хочу, чтобы они использовали разные единицы работы (транзакции).web api controller and castle windsor lifestyle
Все необходимые компоненты (единица работы, репозитории) вводятся через виндзор замка с помощью LifestylePerWebRequest.
Из того, что я понимаю, решение заключается в использовании LifeStyleScoped но у меня есть две проблемы:
- я хочу LifeStyleScoped только для этого конкретного случая, а не вообще
- я не могу найти ни одного примера того, как использовать LifeStyleScoped внутри контроллера.
Любые другие предложения или примеры кода будут оценены по достоинству.
Редактировать: Я не упоминал, что unitofwork не вводится явно в контроллер. Контроллеры вводят две службы, и эти службы используют единицу работы, которая создается через виндзорский замок.
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). В качестве альтернативы, если это не одно требование или вы хотите избежать Locator, вы можете создать собственный IScopeAccessor http://docs.castleproject.org/(S(sgex5w45y1suwnquu1b0gd55))/Print.aspx?NS=Windsor&Page=Windsor.Implementing % 20custom% 20scope & AspxAutoDetectCookieSupport = 1 –