2015-04-10 3 views
0

У меня есть модуль Ninject, которая в основном что-то вдоль линий:Поддерживает ли Ninject временную инъекцию?

public class ExternalApiService { 
    public string BaseUriAddress {get; set;} 
    public string EndpointAddress {get; set;} 
} 

Тогда в моих различных классов я делаю следующее:

[Inject] 
public IExternalApiService ExternalApiService {get; set;} 

Инъекции прекрасно работает, но проблема у меня есть заключается в том, что когда я прихожу к использованию службы в своем коде, мне нужно вручную ввести BaseUriAddress и EndpointAddress. Это немного раздражает, так как это означает, что мне нужно создать некоторые конструкторы и ручной IOC, который сводит на нет точку в структуре IOC.

Я видел, что я могу сделать конструктор и инъекцию поля, однако, похоже, все они определены во время компиляции. Это не совсем правильно, потому что всякий раз, когда я использую ExternalApiService, мне не гарантирован тот же базовый адрес и адрес конечной точки.

В идеале я ищу способ указать эти аргументы во время выполнения, используя Ninject, но с трудом находил, как это возможно. В идеале что-то вроде этого:

[Inject(BaseUriAddress = "", EndpointAddress = "")] 
public IExternalApiService ExternalApiService {get; set;} 

Очевидно, что не совсем, но это по сути вид функциональности, что я пытаюсь реализовать. Это возможно?

+0

Почему вы хотите внедрить модуль в свои компоненты? Это не имеет смысла. Модуль является частью вашего [Root Composition] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/). Никакой код не должен относиться к корню композиции, тогда как корень композиции должен ссылаться на все. Или вы не говорите о [Ninject Modules] (https://github.com/ninject/ninject/wiki/Modules-and-the-Kernel)? – Steven

+0

Является ли «ExternalApiService» синглоном (что-то, что вы создаете один раз, а затем снова и снова повторно использовать) или переходным процессом (что-то потенциально может быть несколько экземпляров)? Вы можете использовать фабрику для создания переходных классов, для которых требуется несколько параметров при построении, но это не будет полезно для одноэлементного. – Sarah

+0

Это переходный период – mike

ответ

1

Если это переходный процесс, и для этого требуются «динамические» параметры, вам необходимо использовать завод. Вы можете пойти с Abstract Factory as Mark Seemann describes it.

В качестве альтернативы вы можете использовать Func<TParam1,TParam2,..,TToBeCreated> или фабрику на основе интерфейса с динамически созданной реализацией (на основе динамического прокси) - оба из которых предоставляются Ninject.Extensions.Factory.

Я лично предпочитаю интерфейс, основанный на фабрике, потому что очень приятно читать и тестировать единицы измерения, но будьте осторожны, недостатки, которые намечают Mark Seemann (также в ссылке выше).

+0

Хотя это правильный способ сделать это, IOC по желанию в сжатом виде также достижимо для меня, расширяя 'IInitializable' – mike

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