В моем приложении я могу зарегистрировать разные источники данных по имени. Каждый из этих источников данных имеет несколько требуемых свойств 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.
Что не хватает в вашем вопросе, так это то, как предоставленные объекты фактически «запрошены». Поэтому я действительно не вижу необходимости в провайдере. Почему бы вам просто не создать привязку? Вы можете добавить аргументы конструктора к привязке. Лучшей практикой может быть создание типа FooParameters или FooSettings для каждого исполнителя. – BatteryBackupUnit
Привет @BatteryBackupUnit - фактические запросы выполняются с помощью подключений Ninject.Mvc в процессе активации контроллера. Идея создания привязки, чтобы справиться с этим честно, мне не пришла в голову, и не создавал объект настроек для каждого другого исполнителя. Я действительно хотел получить как можно больше логики активации ** из привязки, поскольку сами привязки создаются с помощью 'IMissingBindingResolver'. В любом случае мясо моего вопроса касается того, как лучше всего создавать пользовательские «Провайдеры», поскольку этот вопрос возник из-за меня в нескольких разных проектах. – s3raph86