gpt4 book ai didi

dependency-injection - 使用 Ninject 2.0 避免 XNA 中的循环依赖

转载 作者:行者123 更新时间:2023-12-04 08:21:04 25 4
gpt4 key购买 nike

我一直在使用 Ninject 作为 XNA 项目的 IOC,并希望将其迁移到 Ninject 2.0。然而,XNA 不是依赖注入(inject)友好的,因为某些类必须在游戏类的构造函数中实例化,但也必须将游戏类传递给它们的构造函数。例如:

public MyGame ()
{
this.graphicsDeviceManager = new GraphicsDeviceManager (this);
}

一篇文章here描述了一种解决方法,其中 IOC 容器被明确告知要使用哪个实例来解析服务。

/// <summary>Initializes a new Ninject game instance</summary>
/// <param name="kernel">Kernel the game has been created by</param>
public NinjectGame (IKernel kernel)
{
Type type = this.GetType ();

if (type != typeof (Game))
{
this.bindToThis (kernel, type);
}
this.bindToThis (kernel, typeof (Game));
this.bindToThis (kernel, typeof (NinjectGame));
}

/// <summary>Binds the provided type to this instance</summary>
/// <param name="kernel">Kernel the binding will be registered to</param>
/// <param name="serviceType">Service to which this instance will be bound</param>
private void bindToThis (IKernel kernel, Type serviceType)
{
StandardBinding binding = new StandardBinding (kernel, serviceType);
IBindingTargetSyntax binder = new StandardBinder (binding);

binder.ToConstant (this);
kernel.AddBinding (binding);
}

但是,我不确定如何在 Ninject 2.0 中实现这一点,因为我认为是等效代码

if (type != typeof (Game))
{
kernel.Bind (type).ToConstant (this).InSingletonScope ();
}
kernel.Bind (typeof (Game)).ToConstant (this).InSingletonScope ();
kernel.Bind (typeof (NinjectGame)).ToConstant (this).InSingletonScope ();

仍然会产生一个 StackOverflowException。任何关于至少从这里开始的想法将不胜感激。

最佳答案

问题似乎出在 Ninject 没有自动替换之前在 MyGameNinjectGameGame 之间设置的绑定(bind),如果 Bind() 被再次调用。解决方案是调用 Unbind(),然后再次调用 Bind(),或者只调用 Rebind(),这是我选择的做

if (type != typeof (Game))
{
kernel.Rebind (type).ToConstant (this).InSingletonScope ();
}
kernel.Rebind (typeof (Game)).ToConstant (this).InSingletonScope ();
kernel.Rebind (typeof (NinjectGame)).ToConstant (this).InSingletonScope ();

因为如果绑定(bind)在调用之前不存在,它不会抛出异常或导致任何其他问题。

关于dependency-injection - 使用 Ninject 2.0 避免 XNA 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3146587/

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