gpt4 book ai didi

c# - 另一种管理这种依赖的方法

转载 作者:行者123 更新时间:2023-11-30 15:01:27 24 4
gpt4 key购买 nike

我有一个小类,每次需要时都会创建一个数据处理器对象的新实例。我对所有东西都使用了注入(inject),但我无法弄清楚如何在不注入(inject) kernel 的情况下获得 IDataProcessingService 的激活实例。

有没有更好的方法来做到这一点。我知道我可以制作一个静态网关而不是注入(inject),但我认为这是不同皮肤中的相同问题。

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 示例难以阅读。

最佳答案

如果你每次都想要一个新的实例,你可以使用Ninject Factory Extension不依赖于 IKernel。

使用此扩展,您可以创建一个工厂接口(interface)来创建 IDataProcessingService 的实例,但您不需要实现该接口(interface)。此扩展可以为您实现它(在后台将调用 IKernel)。

工厂接口(interface)...

public interface IDataProcessingServiceFactory
{
IDataProcessingService Create();
}

绑定(bind)语句(在运行时自动生成工厂实现)...

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

关于c# - 另一种管理这种依赖的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14199174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com