В обычных проектах ASP.MVC мы настраиваем преобразователь зависимостей с помощью Unity и пакета Unity.Mvc3 из http://unitymvc3.codeplex.com/
У нас есть эта тестовая служба, зарегистрированная в HierarchicalLifetimeManager
container.RegisterType<ITestService, TestService>(new HierarchicalLifetimeManager());
И подключаем контейнер с Mvc в Global.asax.cs:
System.Web.Mvc.DependencyResolver.SetResolver(new Unity.Mvc3.UnityDependencyResolver(container));
И мы запускаем этот тестовый контроллер:
public class TestController : Controller
{
private readonly ITestService _service;
public TestController(ITestService service)
{
this._service = service;
}
public ActionResult Test()
{
var locatedService = System.Web.Mvc.DependencyResolver.Current.GetService<ITestService>();
if (_service == locatedService)
return View("Success - Same Service");//This is always the result in an MVC controller
else
throw new Exception("Failure - Different Service Located");//This is never the result in an MVC controller
}
}
Однако в этом проекте мы добавляем ряд контроллеров WebAPI.
У нас есть эта конфигурация в global.asax.cs (используя http://unitywebapi.codeplex.com/ для сейчас. Но я открыт для предложений):
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
Мы создали ApiTestController
, аналогичный TestController
, наследуя от ApiController
, а не от Controller
. Однако ApiTestController не проходит тест. Я понимаю, что класс System.Web.Mvc.DependencyResolver
и свойство System.Web.Mvc.DependencyResolver.Current
специфичны для Mvc. Но есть ли аналог у WebAPI?
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver.GetService
не работает, потому что экземпляр System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver
является родительским контейнером, который я настроил. Это не дочерний контроллер, который использовался для внедрения ITestService в конструктор.
У этого пользователя похожая проблема: http://unitywebapi.codeplex.com/discussions/359413 Но мне кажется, что это больше связано с WebAPI ASP.NET, чем с Unity.
Спасибо