Применимо ли ограничение Ninject MetaData Get() к дочерним разрешениям?

Я использую ninject.extensions.conventions связать все реализации в данной сборке и пометить их именем сборки в качестве метаданных привязки. Я могу вытащить эти предметы обратно, используя Get и поставляя функцию как стандартную.

Что я хотел бы знать, так это то, относится ли этот функционал ко всем разрешенным детям? Меня беспокоит то, что, хотя моя логика работает сейчас, если я добавлю больше привязок, которые удовлетворят детей, более одного раза бросит ниндзя.

Пример кода:

_kernel.Bind(binder => binder.From(new[] { pathToAssembly })
                             .SelectAllClasses()
                             .BindAllInterfaces()
                             .Configure(binding => 
                                        binding.WithMetadata("context", 
                                                             assemblyName)));


 _kernel.Get<IRootDependency>
         (metadata => metadata.Get<IRootDependency>("context") == 
                                                   assemblyName);

// Bound from convention above.
RootDependencyBase: IRootDependency
{
  Public RootDependencyBase(IChildDependency Child) {};
}

// Bound using the convention above with the same MetaData Tag.
ChildDependencyFromSameAssembly : IChildDependency {}

// Bound using a differing convention and does not have the same MetaData tag.
ChildDependencyFromOtherAssembly : IChildDependency {}

Основываясь на приведенном выше примере, я знаю, что IRootDependency будет преобразован в правильное связывание на основе фильтра метаданных.

То, что я ищу, чтобы узнать, является следующее верно.

Этот фильтр не передает цепочку зависимостей. IChildDependency сгенерирует исключение, потому что, хотя привязка указала метаданные, она не запрашивается.

2 ответа

Решение

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

Чтобы это сработало, вы должны добавить условие к привязкам. Например, вот так:

.When(r => r.ParentContext == null || r.ParentContext.Binding.Metadata.Get<string>("context", null) == assemblyName)

Или получите корневой запрос (request.ParentRequest, пока parentRequest не станет нулевым) и примените ограничение

.When(r => GetRootRequest(r).Constraint(r))

Да, в том случае, если ваши примеры будут иметь другую реализацию IChildDependency в той же сборке, что и ChildDependencyFromSameAssembly вы получите исключение ActivationException с сообщением:

Error activating IDependency
More than one matching bindings are available.

Вы должны предоставить точные критерии для Ninject, чтобы выяснить, какая реализация IChildDependencyИз той же сборки, будет устраивать лучше

Другие вопросы по тегам