【问题标题】:Ninject bind .Net DictionaryNinject 绑定 .Net 字典
【发布时间】:2014-02-21 10:32:04
【问题描述】:

我想将 IDicitionary 绑定到 Dictionary。我尝试了以下绑定:

Bind(typeof (IDictionary<,>)).To(typeof (Dictionary<,>));

Ninject 看到复制构造函数,并尝试使用它——这导致了循环依赖。

如何正确指定此绑定?

【问题讨论】:

  • 你想在这里实现什么?你给消费者注入一个空字典有什么用?请注意Dictionary&lt;K, V&gt; 不是服务,它只是一个数据对象。构建 DI 容器是为了组合由服务(包含行为)组成的对象图;不是数据对象。
  • 它有助于单元测试。在生产中,我希望它从一个空容器开始(可以分配新的,当然,但这没关系)。然而,对于测试,传递一个预先填充的测试可能是有意义的,这样我就可以测试特定的东西而无需设置。
  • 但是在测试过程中你想用什么数据填充它?
  • 适用于测试的任何内容。我也可能会传入一个模拟的字典。
  • 在我看来,你试图做的是一种气味。该字典非常通用,并使您的应用程序完全动态化(就像您正在执行后期绑定一样)。如果您具体说明您希望何时以及如何使用这本词典,我们可以为您提供更好的选择。

标签: .net dependency-injection ninject


【解决方案1】:

我能想到的一种解决方法和两种解决方案(选择最适合您的一种):

  • 创建您自己的字典 MyDictionary&lt;,&gt; : Dictionary&lt;,&gt;(只有一个无参数 ctor)和 Bind(typeof (IDictionary&lt;,&gt;)).To(typeof (MyDictionary&lt;,&gt;));

  • 将绑定修改为:this.Bind(typeof(IDictionary&lt;,&gt;)).ToMethod(ctx =&gt; Activator.CreateInstance(typeof(Dictionary&lt;,&gt;).MakeGenericType(ctx.GenericArguments)));

  • 使绑定适应this.Bind(typeof(IDictionary&lt;,&gt;)).ToConstructor(ctx =&gt; Activator.CreateInstance(typeof(Dictionary&lt;,&gt;).MakeGenericType(ctx.Context.GenericArguments)));

.ToMethod().ToConstructor()之间的区别参见:What's the difference between .ToConstructor and .ToMethod in Ninject 3?

【讨论】:

  • 但我不想要自己的字典,我想要.Net IDictionary。
  • 这是三个独立的解决方案/解决方法。选择最喜欢的一个。 (抱歉没有明确说明)
  • 顺便说一句,因为我建议从 Dictionary 类继承 - 而不是 IDictionary 接口 - 人们可能会争论这将是你自己的实现 - 你甚至不需要再写一个除类定义外的行。但我同意它仍然很臭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多