2014-12-03 3 views
1

Я использую Ninject в своем веб-api. У меня есть следующая проблема. Допустим, есть два контроллера api (ControllerA и ControllerB). Оба зависят от MyClass, и MyClass зависит от ClientFactory и ClientFactory зависит от Resolver.Инъекционная инъекционная зависимость на основе контроллера

public class MyClass 
{ 
    public MyClass(IClientFactory clientFactory) 
    { ... } 
} 

public interface IClientFactory 
{ 
    Client CreateClient(); 
} 

public class ClientFactory : IClientFactory 
{ 
    private readonly IResolver _resolver; 
    public ClientFactory(IResolver resolver) 
    { 
     _resolver = resolver; 
    } 

    ... 
} 

public class ResolverA : IResolver 
{ 
} 

public class ResolverB : IResolver 
{ 
} 

public ControllerA : ApiController 
{ 
    public ControllerA(MyClass myClass) 
    { 
    ... 
    } 
} 

public ControllerB : ApiController 
{ 
    public ControllerB(MyClass myClass) 
    { 
     ... 
    } 
} 

Я хотел бы использовать ResolverA в ClientFactory когда MyClass впрыскивается в ControllerA и ResolverB в ClientFactory когда MyClass вводится в ControllerB. Может ли это быть настроено с помощью Ninject?

спасибо.

+0

Вы посмотрели контекстное связывание https://github.com/ninject/ninject/wiki/Contextual-Binding –

ответ

0

Он может (ключевое слово «контекстное связывание», которое задокументировано в вики ninject here). Однако ваш конкретный вариант использования не поддерживается из коробки. Есть .WhenIsInjectedInto<T>, но это не годится, так как в вашем случае прямой родитель всегда MyClass (вы ищете что-то вроде .WhenHasAncestorOfType<T>()). Таким образом, вы должны свернуть свой собственный:

kernel.Bind<IResolver>() 
    .To<ResolverA>() 
    .WhenAnyAncestorMatches(x => x.Binding.Service == typeof(ControllerA)); 

kernel.Bind<IResolver>() 
    .To<ResolverB>() 
    .WhenAnyAncestorMatches(x => x.Binding.Service == typeof(ControllerB)); 

Конечно в зависимости от того, как контроллер фактически просил у вас, возможно, придется адаптировать x.Binding.Service == typeof(...) часть. Вы также можете ознакомиться с реализацией .WhenIsInjectedInto для идей и рекомендаций.

+0

Спасибо. Оно работает. – partyelite

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