为什么一个0 [length]的byte []被注入我的班级?

时间:2013-08-23 11:17:05

标签: c# asp.net-web-api ninject

我在MVC 4网站上使用Ninject.Web.WebApi-RC。

在我的NinjectWebCommon.cs文件中,我有:

kernel.Bind<IA>().To<A>();
kernel.Bind<byte[]>().ToConstant(new byte[1]).WhenTargetHas<AKeyAttribute>();

在我的WebApi控制器中,我在构造函数中请求IKernel(只是尝试进行故障排除)。我在我的控制器构造函数中调用Get<IA>()A的构造函数如下:

public A([AKey] byte[] key)

其中AKeyAttribute是一个扩展Attribute的类。我的问题是,当代码进入A的构造函数时,它的参数是长度为0的byte,而不是1。

有什么想法吗?谢谢!

修改

这非常奇怪。我已将A的构造函数更改为:

public A([AKey] string test)

我的NinjectWebCommon.cs文件:

kernel.Bind<string>().ToConstant("Test").WhenTargetHas<AKeyAttribute>();

然后"Test"确实被注入控制器。但是,当我这样做时:

public A([AKey] string[] test)
kernel.Bind<string[]>().ToConstant(new string[] { "Test" }).WhenTargetHas<AKeyAttribute>();

这不起作用。

我猜你什么时候在类'构造函数中做一些事情,它期望多次注入?有没有办法覆盖这个?

1 个答案:

答案 0 :(得分:0)

这就是我最终做的事情。如果你需要将一个常量数组注入到构造函数中,你可以改变构造函数,一种方法是注入一个问题类型的Func<>,如下所示:

byte[] hash = ...
kernel.Bind<Func<byte[]>>().
            ToConstant(new Func<byte[]>(() => hash)).
            WhenTargetHas<AKeyAttribute>();

public A([AKey] Func<byte[]> key)

(然后显然在你的构造函数中调用Func<>。)