0

Я хочу вставить контейнер для ввода в WebController.Зависимость от инъекции в контроллере веб-API

У меня есть UnityDependencyResolver:

public class UnityDependencyResolver : IDependencyResolver 
{ 
    readonly IUnityContainer _container; 

    public UnityDependencyResolver(IUnityContainer container) 
    { 
    this._container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return _container.Resolve(serviceType); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return _container.ResolveAll(serviceType); 
     } 
     catch 
     { 
      return new List<object>(); 
     } 
    } 

    public void Dispose() 
    { 
     _container.Dispose(); 
    } 
} 

Тогда в моей Global.asax добавить следующую строку:

var container = new UnityContainer(); 
container.RegisterType<IService, Service> 
(new PerThreadLifetimeManager()).RegisterType<IDALContext, DALContext>(); 
DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

Тогда, если я использую следующие в веб-контроллера:

private IService _service; 

public HomeController(IService srv) 
{ 
    _service = srv; 
} 

Он отлично работает.

Но я хочу, чтобы ввести его в WebAPI контроллер, так что если я делаю это так же:

private IService _service; 

public ValuesController(IService srv) 
{ 
    _service = srv; 
} 

Это не работает, он говорит, что конструктор не определен. Хорошо, я создаю еще один конструктор:

public ValuesController(){} 

И в этом случае он использует только этот конструктор и никогда не тот, в котором я должен придать контейнер единства.

Просьба сообщить.

+0

Является ли это проект WebAPI или MVC приложение, которое случается иметь контроллер API. – jpgrassi

+0

Это проект MVC с API-контроллером. –

ответ

0

Добавить это в WebApiConfig:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Routes and other stuff here... 

     var container = IocContainer.Instance; // Or any other way to fetch your container. 
     config.DependencyResolver = new UnityDependencyResolver(container); 
    } 
} 

И если вы хотите, один и тот же контейнер, вы можете сохранить его в статической переменной, например, так:

public static class IocContainer 
{ 
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 
     return container; 
    }); 

    public static IUnityContainer Instance 
    { 
     get { return Container.Value; } 
    } 
} 

Более подробную информацию можно найти здесь:

http://www.asp.net/web-api/overview/advanced/dependency-injection

Замечание, что я могу также рекомендовать тыс e nuget-package Unity.Mvc. Он добавляет UnityWebActivator и поддерживает PerRequestLifetimeManager.

https://www.nuget.org/packages/Unity.Mvc/

Смежные вопросы