gpt4 book ai didi

inversion-of-control - 我需要更多的 Ninject 实例

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

过去,我使用过 swiftsuspenders,它是一个 actionscript 3 IoC Controller 。基本上,switfsuspender 的第一个版本具有类似于称为注入(inject)器的 Ninject 内核的东西。

如果我想创建一个应用程序注入(inject)器(假设要在整个应用程序中使用最相关的映射),我必须在应用程序类中注入(inject)注入(inject)器本身。

我现在想知道在应用程序的几个类中使用 kernel.get<> 的做法是什么。我应该注入(inject)内核本身吗?

就我个人而言,我宁愿使用 kernel.inject 但如果我可以使用 kernel.inject 我真的可以手动注入(inject)依赖项,这可能会更好(亲吻)。

测试用例很好,但离真正的实际问题还很远,所以我希望你能帮助我澄清这一点。谢谢你。

编辑:我注意到有些人谈论“根容器”,这似乎是我正在寻找的概念。我应该如何设置根容器并让其他应用程序类知道它?

Edit2 示例代码(请原谅错误,这只是为了举例):

class SomeClass
{
public SomeClass()
{
Command cmd = new Command();

cmd.execute();
}

}

class SomeOtherClass:ISomeOtherClass
{
public void allright()
{
//right
}
}

class Command
{
ISomeOtherClass dependency;

void execute()
{
dependency.allright();
}

}


Program.Main()
{
IKernel kernel = new StandardKernel();

kernel.Bind<SomeClass>().ToSelf().InSingletonScope();
kernel.Bind<ISomeOtherClass>().To<SomeOtherClass>();

SomeClass sc = kernel.Get<SomeClass>();
}

我还没有对此进行测试,因为我仍在与一些初始化问题作斗争,但我的问题是,命令类如何知道 SomeOtherClass?我目前的假设是在 SomeClass 中注入(inject)内核并使用 Inject 方法。

最佳答案

查看您的示例,很明显 SomeClass不是在考虑控制反转的情况下构建的;提示是它依赖于 Command ,但在 SomeClass 内部维护了对该依赖项的控制本身。 (Command cmd = new Command();)

要反转对该依赖项的控制,您需要有一种方法将该依赖项注入(inject)到 SomeClass 中。作为 Remo Gloor has indicated ,使用 Ninject 执行此操作的标准方法是通过构造函数。

为此,您可以将 SomeClass 更改为以下内容:

class SomeClass
{
private ICommand _command;

public SomeClass(ICommand injectedCommand)
{
_command = injectedCommand;
_command.execute();
}

}

同样,您需要您的命令来宣传其依赖关系:
class Command
{
private ISomeOtherClass _dependency;

public Command(ISomeOtherClass injectedSomeOtherClass)
{
_dependency = injectedSomeOtherClass;
{

void execute()
{
_dependency.allright();
}
}

然后你会在内核中注册你的命令绑定(bind),可能像:
Program.Main()
{
IKernel kernel = new StandardKernel();

kernel.Bind<SomeClass>().ToSelf().InSingletonScope();
kernel.Bind<ICommand>().To<Command>();
kernel.Bind<ISomeOtherClass>().To<SomeOtherClass>();

SomeClass sc = kernel.Get<SomeClass>();
}

然后内核将能够遍历依赖链并将它们全部注入(inject)。

关于inversion-of-control - 我需要更多的 Ninject 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180866/

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