Применимо ли ограничение 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
Из той же сборки, будет устраивать лучше