2011-09-06 67 views
0

請考慮以下集成測試。我想找到一種方法來正確地調用最後一個Bind函數。架構中兩級深度的上下文綁定

using System.Collections.Generic; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Ninject; 
using Ninject.Modules; 

namespace Cdpq.GCD.Test.Intégration.Ninject 
{ 
    internal interface ISourceDonneesIterable { } 
    class SourceDonnesExtract : ISourceDonneesIterable {} 
    class SourceDonneesPositionsRendements : ISourceDonneesIterable {} 


    interface IFactoryModeleSuiviBornes { } 
    class FactoryModeleSuiviBornes : IFactoryModeleSuiviBornes{} 

    class FactoryStructureFinanciereRendements : IFactoryModeleSuiviBornes 
    { 
     [Inject] public ISourceDonneesIterable sourcePositions { get; set;} 
    } 


    class _ControlleurTableauDeBordDirEstimatif 
    { 
     [Inject] 
     public IFactoryModeleSuiviBornes modeleSuiviBornes { get; set; } 
    } 

    class _ControlleurTableauDeBordDir 
    { 
     [Inject] 
     public IFactoryModeleSuiviBornes modeleSuiviBornes { get; set; } 
    } 

    class BindingModule : NinjectModule { 
     public override void Load() 
     { 
     Bind<IFactoryModeleSuiviBornes>().To<FactoryModeleSuiviBornes>(); 

     Bind<IFactoryModeleSuiviBornes>().To<FactoryStructureFinanciereRendements>().WhenInjectedInto(typeof(_ControlleurTableauDeBordDirEstimatif)); 

     Bind<ISourceDonneesIterable>().To<SourceDonneesPositionsRendements>(); 

     Bind<ISourceDonneesIterable>().To<SourceDonnesExtract>(); 
     } 
    } 

    /// <summary> 
    /// Summary description for UnitTest1 
    /// </summary> 
    [TestClass] 
    public class UnitTest1 
    { 

     [TestMethod] 
     public void integrat_test_ninject_binding() 
     { 
     var Modules = new List<NinjectModule>() 
     { 
      new BindingModule(), 
     }; 

     StandardKernel ObjectFactory = new StandardKernel(Modules.ToArray()); 

     var tb = ObjectFactory.Get<_ControlleurTableauDeBordDir>(); 
     Assert.IsInstanceOfType(tb.modeleSuiviBornes, typeof(FactoryModeleSuiviBornes)); 

     var tbEst = ObjectFactory.Get<_ControlleurTableauDeBordDirEstimatif>(); 
     Assert.IsInstanceOfType(tbEst.modeleSuiviBornes, typeof(FactoryStructureFinanciereRendements)); 

     Assert.IsInstanceOfType(tbEst.modeleSuiviBornes, typeof(FactoryStructureFinanciereRendements)); 

     var factory = (FactoryStructureFinanciereRendements) tbEst.modeleSuiviBornes; 
     Assert.IsInstanceOfType(factory.sourcePositions, typeof(SourceDonnesExtract)); 

     } 
    } 

我的綁定代碼由SO編輯fuxored,但在這裏它是

class BindingModule : NinjectModule { 
     public override void Load() 
     { 
     Bind<IFactoryModeleSuiviBornes>().To<FactoryModeleSuiviBornes>(); 

     Bind<IFactoryModeleSuiviBornes>().To<FactoryStructureFinanciereRendements>().WhenInjectedInto(typeof(_ControlleurTableauDeBordDirEstimatif)); 

     Bind<ISourceDonneesIterable>().To<SourceDonneesPositionsRendements>(); 

     Bind<ISourceDonneesIterable>().To<SourceDonnesExtract>(); 
     } 
    } 

回答

1
Bind<ISourceDonnéesPositionsItérable>().To<SourceDonneesPositionsEstimatives>().When(
     a => a.ParentRequest.ParentRequest.Service.UnderlyingSystemType == typeof(ControllerTableauDeBordDirEstimatif));