1

ninject.extensions.conventions用来绑定给定程序集中的所有实现,并用程序集名称标记它们作为绑定的元数据。我可以使用 Get 将这些项目拉回并提供 func 作为标准。

我想知道的是这个函数是否也适用于所有已解决的孩子?我担心的是,虽然我的逻辑现在有效,但如果我添加更多满足任何孩子不止一次的绑定,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,但它没有被查询。

4

2 回答 2

4

约束仅应用于根分辨率。如果您有多个包含子依赖项的程序集,您将收到异常。

要使其工作,您必须向绑定添加条件。比如像这样:

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

或者获取根请求(request.ParentRequest 直到 parentRequest 为空)并应用约束

.When(r => GetRootRequest(r).Constraint(r))
于 2013-01-14T14:31:33.700 回答
2

的,如果您的示例IChildDependency在同一个程序集中有另一个实现,ChildDependencyFromSameAssembly您将收到ActivationException消息异常:

Error activating IDependency
More than one matching bindings are available.

您必须向 Ninject 提供准确的标准,以IChildDependency从同一个程序集中找到更适合的实现

于 2013-01-14T14:32:36.220 回答