我有一个接口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以获得我想要的结果?
答案 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>
。