我使用ninject.extensions.conventions
绑定给定程序集中的所有实现,并使用程序集名称作为绑定的元数据标记它们。我可以使用获取和提供功能作为标准来取回这些项目。
我想知道的是,这个功能是否也适用于所有被解决的孩子?我担心的是,虽然我的逻辑现在有效,但如果我添加更多的绑定来满足任何孩子,ninject将会抛出多次。
代码示例:
_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将抛出异常,因为虽然绑定指定了MetaData,但它不会被查询。
答案 0 :(得分:4)
约束仅适用于根分辨率。如果您有多个包含子依赖项的程序集,您将获得异常。
要使其工作,您必须为绑定添加条件。例如:
.When(r => r.ParentContext == null || r.ParentContext.Binding.Metadata.Get<string>("context", null) == assemblyName)
或者获取root请求(request.ParentRequest,直到parentRequest为null)并应用约束
.When(r => GetRootRequest(r).Constraint(r))
答案 1 :(得分:2)
是,如果您的示例在与IChildDependency
相同的程序集中有另一个ChildDependencyFromSameAssembly
实现,您将获得异常ActivationException
并带有消息:< / p>
Error activating IDependency
More than one matching bindings are available.
你必须为Ninject提供准确的标准,以便从同一个程序集中找到IChildDependency
的实现更适合