gpt4 book ai didi

c# - 注入(inject) InSingletonScope 的对象是否也可以注入(inject)到其他地方的多重绑定(bind)中?

转载 作者:行者123 更新时间:2023-11-30 14:50:33 25 4
gpt4 key购买 nike

我需要绑定(bind) ICommand到一个特定的实现当完全注入(inject)一个特定的类型时(通过命名约定),然后我还需要一个具有 IEnumerable<ICommand> 的类型的多重绑定(bind)构造函数参数 - 那个需要接收相同的实例,因为我需要我的命令 InSingletonScope

我试过这个,除其他外:

// note: ICommandMenuItem naming convention for [Foo]Command: [Foo]CommandMenuItem
var item = types.SingleOrDefault(type => type.Name == commandName + "CommandMenuItem");
if (item != null)
{
_kernel.Bind<ICommand>().To(command)
.WhenInjectedExactlyInto(item)
.InSingletonScope()
.DefinesNamedScope("commands");

_kernel.Bind<ICommand>().To(command)
.WhenInjectedExactlyInto<ConfigurationLoader>()
.InNamedScope("commands");
}

但每次我进入 ConfigurationLoader 的构造函数时, IEnumerable<ICommand>参数不包含任何元素。无论有没有命名范围,我都一样,我认为我需要告诉 Ninject“看,我有这两个绑定(bind)相同的类型,我希望你给我两个相同的实例”。

第一个绑定(bind)起作用了——我知道是因为我的菜单项在被单击时会执行某些操作。但是方式有问题ICommand是(不是?!)注入(inject) ConfigurationLoader ,我不确定如何修复它。

最佳答案

据我所知,命名范围在这里毫无意义:

  • DefinesNamedScope定义命名范围的根
  • InNamedScope确保只有一个 T 实例在根的依赖树中。这也意味着一旦根对象被垃圾回收,它就会被处置。

当您希望所有命令都在单例范围内时,请不要使用其他命令。还有,只要ConfigurationLoader不是菜单项的( transient )依赖项,InNamedScope无论如何,永远不会实现。

此外,InSingletonScope()应用于每个绑定(bind)。 IE。如果您有两个相同类型的绑定(bind),InSingletonScope()将(可能)导致两种情况。这就是为什么有 Bind(Type[])重载,您可以在其中将多个服务绑定(bind)到一个分辨率。

您需要的是一个带有 OR 的单一绑定(bind)条件:

// note: ICommandMenuItem naming convention for [Foo]Command: [Foo]CommandMenuItem
var item = types.SingleOrDefault(type => type.Name == commandName + "CommandMenuItem");
if (item != null)
{
_kernel.Bind<ICommand>().To(command)
.WhenInjectedExactlyIntoAnyOf(item, typeof(ConfigurationLoader))
.InSingletonScope();
}

现在,当然是 WhenInjectedExactlyIntoAnyOf不可用。另外,遗憾的是,ninject 并没有开箱即用的方式来结合现有条件。所以,你必须根据 When(Func<IRequest,bool> condition) 推出你自己的条件.


有一种稍微老套的方式来组合现有的 When...状况。可以先创建没有任何条件的绑定(bind),然后添加条件、检索它(它是 Func<IRequest,bool> ),然后替换条件、检索它、组合它、替换它……等等……

// example binding without condition
var binding = kernel.Bind<string>().ToSelf();

// adding an initial condition and retrieving it
Func<IRequest, bool> whenIntegerCondition = binding.WhenInjectedInto<int()
.BindingConfiguration.Condition;

// replacing condition by second condition and retrieving it
Func<IRequest, bool> whenDoubleCondition = binding.WhenInjectedInto<double>().
BindingConfiguration.Condition;

// replacing the condition with combined condition and finishing binding
binding.When(req => whenIntCondition(req) || whenDoubleCondition(req))
.InSingletonScope();

关于c# - 注入(inject) InSingletonScope 的对象是否也可以注入(inject)到其他地方的多重绑定(bind)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36276535/

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