2012-07-05 38 views
1

我正在處理拆分多個程序集的應用程序。每個程序集都爲外界提供接口,實例通過基於Ninject的工廠生成。Ninject注入鏈隔離

好啊,讓代碼。這是來自正在執行的程序集。

public class IsolationTestModule : NinjectModule 
{ 
    public override void Load() 
    { 
     ServiceFactory sf = new ServiceFactory(); 
     Bind<IService>().ToMethod(context=>sf.CreatService()).InSingletonScope(); 
    } 
} 

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     IKernel kernel = new StandardKernel(new IsolationTestModule()); 
     IService service = kernel.Get<IService>(); 
    } 
} 

ServiceFactory也依賴於Ninject,但有自己的Kernel和自己的Module

public interface IService 
{ 
    void Idle(); 
} 

public interface IDependantService 
{ 
    void IdleGracefully(); 
} 

public class ServiceImpl : IService 
{ 
    [Inject] 
    public IDependantService DependantService { get; set; } 

    public void Idle() 
    { 
     DependantService.IdleGracefully(); 
    } 
} 

public class DependantServiceImpl : IDependantService 
{ 
    public void IdleGracefully() { } 
} 

public class ServiceFactory 
{ 
    private IKernel _kernel = new StandardKernel(new SuppliesModule()); 

    public IService CreatService() 
    { 
     return _kernel.Get<IService>(); 
    } 
} 

public class SuppliesModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IService>().To<ServiceImpl>().InSingletonScope(); 
     Bind<IDependantService>().To<DependantServiceImpl>().InSingletonScope(); 
    } 
} 

實際發生的:一切正常,直到ServiceFactory已完成建造ServiceImpl -instance 。在接下來的步驟中,應用程序的kernel試圖通過IsolationTestModule解決ServiceImpl依賴和 - 當然 - 失敗的異常(不綁定可用,類型IDependantService不自綁定)。在我的理解工廠的內核應該這樣做... 其實我從來不知道Ninject是那種渴望解決依賴關係,即使在那些沒有立即創建的情況下,這肯定會爲我開啓新的視野; )

要暫時解決這個問題,我改變ServiceImpl來構造基於注射爲下圖所示:

public class ServiceImpl : IService 
{ 
    public IDependantService DependantService { get; set; } 

    [Inject] 
    public ServiceImpl(IDependantService dependantService) 
    { 
     DependantService = dependantService; 
    } 

    public void Idle() 
    { 
     DependantService.IdleGracefully(); 
    } 
} 

不過,我寧願一個解決方案,不強迫我改變我的注入策略。有沒有人有一個想法,我可以如何分開注射鏈?

+0

任何人都可以幫忙嗎? –

回答

1

您的觀察結果是正確的。 Ninject將爲由ToMethod創建的對象執行屬性注入。您的解決方案使用構造函數注入是正確的方法。無論如何,構造函數注入是使用Ninject的一種方式。屬性注入只能用於可選的依賴關係。

你應該考慮的是隻使用一個內核。在應用程序中使用多個內核實例是非常不尋常的。

+0

感謝您的迴應,雷莫。事實上,我正在創建三個完全獨立的組件。那些 - 巧合的是,你可能會說 - 有使用Ninject的習慣,可以同時使用。每個人都在內部使用Ninject **,但只向外部暴露Factory類和接口。我已經轉換到構造器注入,所以這基本上解決了。 –