2016-11-30 8 views
0

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

Чтобы создать экземпляры каждого источника данных по запросу, я создаю привязку к экземпляру Provider<T>, который инициализируется информацией, необходимой для доступа к этому источнику данных. Провайдер выглядит что-то вроде ниже:

public class StandardListProvider<T> : Provider<IListExecutor<T>> 
    where T : new() 
{ 
    public string Name  { get; set; } 
    public string ListMethod { get; set; } 

    public StandardListProvider(string name, string listMethod) 
    { 
     Name  = name; 
     ListMethod = listMethod; 
    } 

    protected override IListExecutor<T> CreateInstance(IContext context) 
    { 
     var connector = (IInternalConnector)context.Kernel.GetService(typeof(IInternalConnector)); 
     return new StandardListExecutor<T>(connector, Name) 
     { 
      ListMethodName = ListMethod 
     }; 
    } 
} 

Проблема с разрешения зависимостей в StandardListExecutor<T> как IInternalConnector. Очевидно, что я могу создать их вручную или запросить их у context.Kernel, поскольку я в своем примере (и предложен Ninject Providers -> Get another dependency inside the provider), но это приводит к запросу без целевой информации, что не идеально, если мы хотим выполнять контекстные привязки для зависимостей от StandardListExecutor.

Я пробовал играть с context.Request.CreateChild(...), но для каждой активации требуется отразить каждую активацию, чтобы создать ParameterTarget. В документах Ninject также не так много информации об этом.

Мой вопрос: Каков правильный способ разрешения/запроса зависимостей или других сервисов, подобных этому в процессе активации существующей привязки?

Редактировать

Запросов сами сделаны через сцепления Ninject.Mvc в процесс активации контроллера System.Web.Mvc.

+0

Что не хватает в вашем вопросе, так это то, как предоставленные объекты фактически «запрошены». Поэтому я действительно не вижу необходимости в провайдере. Почему бы вам просто не создать привязку? Вы можете добавить аргументы конструктора к привязке. Лучшей практикой может быть создание типа FooParameters или FooSettings для каждого исполнителя. – BatteryBackupUnit

+0

Привет @BatteryBackupUnit - фактические запросы выполняются с помощью подключений Ninject.Mvc в процессе активации контроллера. Идея создания привязки, чтобы справиться с этим честно, мне не пришла в голову, и не создавал объект настроек для каждого другого исполнителя. Я действительно хотел получить как можно больше логики активации ** из привязки, поскольку сами привязки создаются с помощью 'IMissingBindingResolver'. В любом случае мясо моего вопроса касается того, как лучше всего создавать пользовательские «Провайдеры», поскольку этот вопрос возник из-за меня в нескольких разных проектах. – s3raph86

ответ

0

Вы должны иметь возможность использовать расширение Ninject.Extensions.ContextPreservation. В частности, метод расширения IContext.ContextPreservingGet(...):

var connector = context.ContextPreservingGet<IInternalConnector>(); 

Однако, лично я считаю, что создание конкретных типов настроек является лучшим выбором - потому, что это проще идея.

+0

Точно, что я был после - спасибо! – s3raph86