Ninject MetaData是否限制了Get()适用于子分辨率?

时间:2013-01-14 09:32:44

标签: ninject ninject-conventions

我使用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,但它不会被查询。

2 个答案:

答案 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的实现更适合