gpt4 book ai didi

ninject - 在 Ninject 中继承 ConstructorArguments

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

我试图找到一种将构造函数参数传递给子类的构造函数的方法。
这些对象是不可变的,所以我更喜欢使用构造函数参数。

我遇到的问题是 ConstructorArgument 不继承到子实例化,并且以下语句不可互换:

_parsingProcessor = _kernel.Get<IParsingProcessor>(new ConstructorArgument("dataFilePath", dataFilePath);


_parsingProcessor = _kernel.Get<IParsingProcessor>(new Parameter("dataFilePath", dataFilePath, true);

那么,如何获得可继承的 ConstructorArgument 以及何时有意义(如果有的话)新建 Parameter 类?

最佳答案

是的,你可以这样做,但这可能不是你真正想要的。如果容器实际上不负责实例化它自己的依赖项,那么它的依赖项可能不应该共享它的构造函数参数——它只是没有意义。

我很确定我知道您要做什么,推荐的方法是专门为您的一个容器创建一个独特的绑定(bind),并使用 WhenInjectedInto条件绑定(bind)语法,如下例所示:

public class Hello : IHello
{
private readonly string name;

public Hello(string name)
{
this.name = name;
}

public void SayHello()
{
Console.WriteLine("Hello, {0}!", name);
}
}

这是一个接受我们想要修改的构造函数参数的类,这取决于谁在请求 IHello .假设这是一个无聊的容器类:
public class MyApp : IApp
{
private readonly IHello hello;

public MyApp(IHello hello)
{
this.hello = hello;
}

public virtual void Run()
{
hello.SayHello();
Console.ReadLine();
}
}

现在,这里是你如何做绑定(bind):
public class MainModule : NinjectModule
{
public override void Load()
{
Bind<IApp>().To<MyApp>();
Bind<IHello>().To<Hello>()
.WithConstructorArgument("name", "Jim");
Bind<IHello>().To<Hello>()
.WhenInjectedInto<MyApp>()
.WithConstructorArgument("name", "Bob");
}
}

基本上所有这些绑定(bind)都在说 name应该是“吉姆” 除非 Hello 正在请求它,在这种情况下就是这样,因此它将获得名称“Bob”。

如果您绝对确定您确实想要级联行为并理解这是 非常危险和脆弱 ,您可以使用方法绑定(bind)作弊。假设我们现在添加了 name MyApp 的参数出于某些未指定目的的类,绑定(bind)将是:
Bind<IHello>().ToMethod(ctx =>
ctx.Kernel.Get<Hello>(ctx.Request.ParentContext.Parameters
.OfType<ConstructorArgument>()
.Where(c => c.Name == "name")
.First()));

拜托,拜托,在做之前确保你确定这是你想要的。它看起来很简单,但在简单的重构过程中也很可能会中断,而且我见过的 95% 的“自定义依赖”场景都可以使用 WhenInjectedInto 解决。而是绑定(bind)。

关于ninject - 在 Ninject 中继承 ConstructorArguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5300346/

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