2013-01-14 33 views
1

我正在使用ninject.extensions.conventions來綁定給定程序集中的所有實現,並用程序集名稱作爲綁定的元數據標記它們。我可以使用Get和提供一個func作爲標準,將這些項目退出。Do Ninject元數據受限Get()是否適用於子分辨率?

我想知道的是,這個功能適用於所有解決的孩子嗎?我的擔心是,儘管我的邏輯現在可行,但如果我添加更多綁定,以滿足任何孩子不止一次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

您是否擔心給定程序集中的相同接口/抽象類的兩個或更多實現?當然,在這種情況下,你會得到一個異常,因爲Ninject無法解決依賴關係。 – Akim

+0

@Akim兩個或更多子實現。由於元數據約束func,父代會解決得很好。我正在查看是否也將相同的約束應用於任何子分辨率。 – deanvmc

+0

你能提供一個例子嗎?這裏是[我的例子,當'Ninject.Extensions.Conventions'不能解決automaticaly的依賴關係,並拋出一個ActivationException:Error激活IDependency。不止一個匹配的綁定可用.'](https://gist.github.com/4530019) – Akim

回答

4

限制僅適用於根分辨率。如果你有多個程序集包含一個子依賴項,你將會得到一個異常。

爲了讓它工作,你必須添加一個條件的綁定。例如,像這樣:

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

或者獲得root請求(request.ParentRequest直到parentRequest爲空),並應用約束

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

謝謝雷莫。最後一項要清楚。它看起來是我想要的第二個。有沒有辦法在我當前的綁定中應用第二個選項,因爲根據調用者的不同,給定的服務可能既是根又是孩子。通常這不是問題,但在我的實例(Web API)中沒有單個根。類似.Configure(x => x.WithMetadata(「context」,assemblyName)|| x.When(r => GetRootRequest(r).Constraint(r)))); – deanvmc

2

,萬一要是你的例子有另一種實現方式在相同的裝配IChildDependency作爲ChildDependencyFromSameAssembly你會得到異常ActivationException與消息:

Error activating IDependency 
More than one matching bindings are available. 

您必須向Ninject提供確切的標準,才能找到來自同一個程序集的IChildDependency更適合的實現