2013-01-07 110 views
3

我有一個小類,每次需要它時都會創建一個數據處理器對象的新實例。我正在使用注入的一切,但我不知道如何獲得激活的實例IDataProcessingService而不注入kernel管理這種依賴關係的另一種方法

有沒有更好的方法來做到這一點。我知道我可以做一個靜態網關,而不是注入,但我會認爲這是同一個問題在不同的皮膚。

public class DataProcessingManager 
{ 
    private readonly Dictionary<IDataProcessingRequest, IDataProcessingService> _activeProcessingServices; 

    private readonly IKernel _kernel; 

    public DataProcessingManager(IKernel kernel) 
    { 
     _kernel = kernel; 
     _activeProcessingServices = new Dictionary<IDataProcessingRequest, IDataProcessingService>(new DataProcessingRequestComparer()); 
    } 

    public void ProcessFor(IDataProcessingRequest dataProcessingRequest) 
    { 
     if (!_activeProcessingServices.ContainsKey(dataProcessingRequest)) 
     { 
      var _processingService = _kernel.Get<IDataProcessingService>(); 
      _activeProcessingServices.Add(dataProcessingRequest, _processingService); 

      _processingService.ProcessingFinished += 
       (sender, args) => _activeProcessingServices.Remove(dataProcessingRequest); 

      _processingService.Process(dataProcessingRequest); 
     } 
    } 
} 

編輯2:

我作爲原建議的實現不是創建新實例這正是我需要改變接受的答案。我知道我可以通過引用內核來使用原始的答案,但這不是我想要的。最後,新答案中的.ToFactory()慣例是更好的方式。

我會聯繫擴展程序的作者,並要求他更新代碼示例,因爲Foo..Bar示例很難閱讀。

+0

爲什麼你不希望注入內核對象? –

+0

你不想注入內核嗎?也許創建內核(或其他類)實現的第二個接口('IDataProcessingServiceProvider')? –

+0

@EricPetroelje因爲它危害組合性。 – deanvmc

回答

4

如果你想每次都有一個新的實例,你可以使用Ninject Factory Extension來不依賴於IKernel。

使用此擴展,您可以創建一個工廠接口來創建IDataProcessingService的實例,但不需要實現該接口。這個擴展可以爲你實現它(它將在後臺調用IKernel)。

工廠接口...

public interface IDataProcessingServiceFactory 
{ 
    IDataProcessingService Create(); 
} 

約束力的聲明(其中自動生成在運行時,工廠實現)...

kernel.Bind<IDataProcessingServiceFactory>().ToFactory(); 
+0

它如何知道如何建立工廠?在我的實例中,我在同一個命名空間中有一個DataProcessingService對象,但在不同的命名空間中我也可以有其他的。你有沒有關於它的解決方案的任何細節,我讀過維基,但有太多的Foo和Bar對我來說是有意義的。 – deanvmc

+1

我幾遍讀了這個例子,現在它很有意義。它使用create方法的返回類型通過工廠提供正確的實現。這就是我要的。標示爲接受,歡呼。 – deanvmc

+0

如果你有一個很好的例子來更好地解釋它,只需從擴展項目編輯GH wiki –

1

如果你不想爲「依賴」於IKernel,您可以創建第二個界面,將提供的服務:

interface IDataProcessingServiceProvider 
{ 
    IDataProcessingService GetService(); 
} 

然後,您可以有你的內核實現該接口和存根出來的測試時無需實現整個IKernel接口。

+0

我喜歡它,漂亮乾淨,歡呼聲。 – deanvmc

+0

這只是將問題轉移到依賴於IKernel的另一個類。我在這個答案中看不到什麼好處。 – TylerOhlsen

0

general consensus是讓應用程序邏輯依賴於容器或容器抽象是不好的。但是,擁有基礎設施組件依賴於容器is fine

但是,嘗試阻止混合應用程序邏輯與基礎架構邏輯。訣竅通常是以一種可以成爲純應用程序或純基礎架構的方式提取類。