我正在使用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,但不會被查詢。
您是否擔心給定程序集中的相同接口/抽象類的兩個或更多實現?當然,在這種情況下,你會得到一個異常,因爲Ninject無法解決依賴關係。 – Akim
@Akim兩個或更多子實現。由於元數據約束func,父代會解決得很好。我正在查看是否也將相同的約束應用於任何子分辨率。 – deanvmc
你能提供一個例子嗎?這裏是[我的例子,當'Ninject.Extensions.Conventions'不能解決automaticaly的依賴關係,並拋出一個ActivationException:Error激活IDependency。不止一個匹配的綁定可用.'](https://gist.github.com/4530019) – Akim