在Ninject中解析每个已注册的子实例的父实例

时间:2015-11-25 15:08:04

标签: ninject

我有一个接口public interface IThing,其中有多个实现:

  • public class Thing1 : IThing
  • public class Thing2 : IThing
  • public class Thing3 : IThing

我还有另一个接受IThing

实例的类
public class CallThing
{
    public CallThing(IThing) { ... }
}

我希望能够做的是从Ninject解析每个CallThing实施的IThing实例:

var kernel = new StandardKernel();
kernel.Bind<IThing>().To<Thing1>();
kernel.Bind<IThing>().To<Thing2>();
kernel.Bind<IThing>().To<Thing3>();

kernel.Bind<CallThing>().ToSelf();

var callThings = kernel.GetAll<CallThing>();

目前,我得到以下例外:

Unhandled Exception: Ninject.ActivationException: Error activating IThing
More than one matching bindings are available.
Matching bindings:
  1) binding from IThing to Thing1
  2) binding from IThing to Thing2
  3) binding from IThing to Thing3
Activation path:
  2) Injection of dependency IThing into parameter thing of constructor of type
CallThing
  1) Request for CallThing

Suggestions:
  1) Ensure that you have defined a binding for IThing only once.

如何配置Ninject以获得我想要的结果?

1 个答案:

答案 0 :(得分:1)

这不是ninject支持的案例。 你必须自己每tan(beta) = sin(beta) / cos(beta) == ((Va x Vb) . Vn) / (Va . Vb) 创建一个CallThing(意思是:使用工厂,例如Ninject.Extensions.Factory Func-Factory或接口工厂)。

你也可以注册一个IThing为你做这个,或者像这样构建一个集合类型,但要注意,ninjects多注入功能取代了多注入集合的任何注册。例如:

IProvider

按预期工作。

但是,您可以做的是:

Bind<string[]>().ToConstant(new[] { "Foo", "bar" });

然后注入kernel.Bind<IReadOnlyCollection<CallThing>>() .ToMethod(ctx => ctx.Kernel.GetAll<IThing>() .Select(t => CreateCallThingPerThing(ctx.Kernel, t)) .ToList()); public static CallThing CreateCallThingPerThing( IResolutionRoot resolutionRoot, IThing thing) { var parameter = new TypeMatchingConstructorArgument( typeof(IThing), (ctx, target) => thing); return resolutionRoot.Get<CallThing>(parameter); } 。 这是因为ninject的多注入功能不支持IReadOnlyCollection<CallThing>