2014-09-26 65 views
0

有沒有一種方法可以將調用與FromAssembliesMatching結合起來以自動設置大多數接口並使用一些顯式綁定?我有以下的代碼應該將所有自動ISomething的東西,然後建立了地方的具體落實接受兩個布爾變量作爲自變量的IUnitOfWork接口的特定構造:FromAssembliesMatching覆蓋明確設置的綁定

kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses() 
     .InNamespaces("MyNamespace").BindDefaultInterface()); 
kernel.Bind<IUnitOfWork>().ToConstructor(x => new UnitOfWork(true, false)); 

然而,當我嘗試調用TryGet這樣我得到一個空回:

kernel.TryGet<MyNamespace.IUnitOfWork>() 

它正常工作時,我周圍的切換順序和呼叫的第二個電話不包括對執行的UnitOfWork明確:

kernel.Bind<IUnitOfWork>().ToConstructor(x => new UnitOfWork(true, false)); 
kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses() 
     .InNamespaces("MyNamespace").Excluding(typeof(UnitOfWork)) 
     .BindDefaultInterface()); 

顛倒順序,或者在嘗試解析IUnitOfWork的實例時再次將調用排除在空外。

結合自動匹配和顯式配置的正確方法是什麼?我正在使用Ninject 3.2.0.0和Ninject.Extensions.Conventions 3.2.0.0。

回答

1

有兩種方法來處理你的情況,你一個已經找到:

  • Excluding<>從約定的類型。
    • 優點:這是你的「手冊」和約定綁定的序列不可知的。
    • 缺點:您需要參考的特殊情況的地方,在公約和「手動」使用Rebind<IUnitOfWork>而不是綁定結合
    • 優點:你不需要參考兩個地方的特例。
    • 缺點:這隻適用於在執行Rebind之前執行約定綁定的情況。

當然,你也可以將屬性添加到應該從約定排除所有類型的並相應地調整你的約定。但我懷疑這會更好。

順便說一句,我們可以想象擴展約定來檢查該類型的綁定是否已經存在,並且只創建一個新的綁定(如果沒有)。除了多重綁定和上下文綁定的明顯複雜性之外,ninject並不容易檢查是否存在對「實現」類型的綁定。全部是IKernel.GetBindings(Type serviceType)。由於一些內部原因,這不能輕易改變。