2014-01-20 61 views
1

我處於Ninject困境中。另外,如何將我的C#解決方案中的多個區域綁定到同一個容器。總而言之,我知道通過Ninject模塊進行加載是實現這一目標的最佳方法,但我無法直接訪問內核(正如我所瞭解的那樣,反模式)來撥打_kernel.Get<T>()使用Ninject注入類庫,其中構造函數接受多個參數

所以我相信構造函數注入是最好的方法。現在假設我有頂層類Program,它加載Module : NinjectModule

class Program 
{ 
    IKernel _kernel; 
    public static main() 
    { 
     _kernel = new StandardKernel(); 
     _kernel.Load(ClassA.Module); 
     _kernel.Load(ClassB.Module); 

    } 
} 

爲了保持代碼到最低限度,假設ClassA的模塊並列的ISomething所有實現對ConcreteSomething,並且ClassB(其中ClassA取決於)實現以下構造方法;

public ClassB(ISomething thing, int paramA, int paramB) 
{ 
    //Do stuff with paramA and paramB using thing 
} 

在一個單一的解決方案中,_KERNEL可以直接訪問,_kernel.Get<ClassB>.WithConstructorArgument("paramA", 123).WithCon...

不過,我不確定如何這會工作,其中提供類有它的調用者容器的訪問權限。

有一種想法超越了我的想法是使用工廠方法,但我不知道這是如何工作的。

任何重量將不勝感激。

+0

paramA,paramB(ClassB的ctor)的值來自哪裏? – BatteryBackupUnit

回答

1

對於依賴關係,使用構造函數注入是正確的。

如何將參數(paramA,paramB)移動到方法,如初始化或執行?

如果這不合理(如其命令),那麼你將需要使用工廠。 看看https://github.com/ninject/ninject.extensions.factory

對於工廠擴展不支持的用例,您始終可以擁有一個獲得IResolutionRoot注入的工廠。您可以在該界面上執行獲取<>。工廠可以駐留在任何組裝中。

public class FactoryB : IFactoryB { 
    private readonly IResolutionRoot resolutionRoot; 
    public FactoryB(IResolutionRoot resolutionRoot) { 
     this.resolutionRoot = resolutionRoot; 
    } 

    public IClassB Create(int paramA, int paramB) { 
     return this.resolutionRoot.Get<IClassB>(new ConstructorArgument("paramA", paramA), new ConstructorArgument("paramB", paramB)); 
    } 
} 

但是,我想知道是否真的需要爲paramA,paramB使用工廠。這取決於值來自何處/如何確定。它們是依賴於classA還是隻是「全局配置」值?

+0

在我的情況下,這些參數將從組合根(即:'Programme aka GUI客戶端)級聯下來,但是,我可能需要使用中間庫(本例中爲'ClassA')的一些元素。就我而言,我有一個RESTful PCL,它需要爲特定平臺傳遞特定的散列/加密算法。平臺聲明將在組合根目錄('Client。{platform}')中進行並傳遞給跨所有平臺共享的核心客戶端庫。然後調用PCL,注入特定的'IHash'加密哈希。 –

+1

在這種情況下,應該很容易在組合根('Client。{platform}')中綁定'IHash',並在中間庫('ClassA')。您可能想考慮基於約定的模塊加載,因此您需要儘可能少地在您的「Client。{platform}」組合根目錄中進行配置。 – BatteryBackupUnit

+0

我不得不放棄IoC,因爲我們需要發佈最低可行產品。有幾個緊密耦合的類需要在覈心客戶端庫中進行大量的工作(還有一堆PCL的困境),但是在接下來的幾周重寫時我會注意到這個建議。 –

相關問題