2013-01-07 49 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

但是,尝试阻止混合应用程序逻辑与基础架构逻辑。诀窍通常是以一种可以成为纯应用程序或纯基础架构的方式提取类。