我有一个小类,每次需要它时都会创建一个数据处理器对象的新实例。我正在使用注入的一切,但我不知道如何获得激活的实例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
示例很难阅读。
为什么你不希望注入内核对象? –
你不想注入内核吗?也许创建内核(或其他类)实现的第二个接口('IDataProcessingServiceProvider')? –
@EricPetroelje因为它危害组合性。 – deanvmc