C# 为什么将长度为0的字节[]注入到我的类中?

C# 为什么将长度为0的字节[]注入到我的类中?,c#,asp.net-web-api,ninject,C#,Asp.net Web Api,Ninject,我正在MVC4网站中使用Ninject.Web.WebApi-RC 在我的NinjectWebCommon.cs文件中,我有: kernel.Bind<IA>().To<A>(); kernel.Bind<byte[]>().ToConstant(new byte[1]).WhenTargetHas<AKeyAttribute>(); 其中,AKeyAttribute是扩展属性的类。我的问题是,当代码进入A的构造函数时,它的参数是长度为0而不是1

我正在MVC4网站中使用Ninject.Web.WebApi-RC

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

kernel.Bind<IA>().To<A>();
kernel.Bind<byte[]>().ToConstant(new byte[1]).WhenTargetHas<AKeyAttribute>();
其中,
AKeyAttribute
是扩展
属性的类。我的问题是,当代码进入
A
的构造函数时,它的参数是长度为0而不是1的
字节

有什么想法吗?谢谢

编辑

这真是不可思议。我已将
A
的构造函数更改为:

public A([AKey] string test)
以及我的NinjectWebCommon.cs文件:

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


我猜当你在一个类的构造函数中做一个数组的时候,它期望多重注入?有什么方法可以克服这个问题吗?

以下是我最后做的事情。如果需要将常量数组注入构造函数,并且可以更改构造函数,一种方法是注入所讨论类型的
Func
,如下所示:

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

public A([AKey] Func<byte[]> key)
byte[]散列=。。。
kernel.Bind()。
ToConstant(新函数(()=>hash))。
WhenTargetHas();
公共A([AKey]Func键)

(然后在构造函数中调用
Func

Byte
string
是不明确的类型。它们通常包含配置值(如连接字符串、文件路径等),注册本身无法说明该值是什么。防止将此类类型或该类型的集合直接注册到容器中。在
字节[]
中到底有什么信息?我有一个类(
B
),它接受
IA
的一个实例。我的
IA
实现做了一些加密工作,需要一个密钥,该密钥将随此web应用的部署而变化。我使用连接字符串的散列(一个不同的
字节[]
)作为注入我的
IA
实例的键。无论如何,我不认为是原语,而是数组。我认为Ninject看到了
字节[]
,并查找了注册用于执行多重注入的
字节。我发现了一些有用的东西,并把它作为我的答案发布了出来。很好,这是可行的,但是当你有第二个字节数组需要注入到某个地方时,你会怎么做呢?通过使用委托(即
Bind().ToMethod(c=>newa(hash))
)注册类型A,或使用构造函数参数重写:
Bind().To().WithConstructorArgument(“hash”,hash)
),防止出现这种情况。如果您需要将此散列注入多个组件,最好将此散列隐藏在抽象后面(例如
IHashingProvider
)。如果我正确理解您的注释,我使用带有
A
的属性作为前缀(即
AKeyAttribute
)来完成此操作。因此,如果我在类
C
中需要一个
byte[]
,那么我将创建另一个属性。虽然您的方法修复了对属性的需求,但我认为我公司的上级(即架构师-我只是一名助理软件工程师)更喜欢以我的方式进行编码。我真的无法想象有人会喜欢用属性来混乱他们的代码库。您应该努力使用无属性的DI配置,这对于大多数容器来说实际上相当容易实现。我建议在贵公司重新开始讨论。
public A([AKey] string[] test)
kernel.Bind<string[]>().ToConstant(new string[] { "Test" }).WhenTargetHas<AKeyAttribute>();
byte[] hash = ...
kernel.Bind<Func<byte[]>>().
            ToConstant(new Func<byte[]>(() => hash)).
            WhenTargetHas<AKeyAttribute>();

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