Func-Auto 与 Func-Factory 的绑定是 Ninject.Extensions.Factory 的一项功能。参见来源:函数模块.cs https://github.com/ninject/ninject.extensions.factory/blob/master/src/Ninject.Extensions.Factory/FuncModule.cs
如果您为以下对象创建特定绑定Func<T, T>
它仍然会覆盖由创建的通用绑定FuncModule
。但正如您所注意到的,如果您不创建该特定绑定,则不会有任何例外。
摆脱默认(开放)绑定的最简单方法是摆脱 Factory 扩展。
但这可能有点极端。您还可以做的就是禁用自动扩展加载 https://github.com/ninject/ninject/wiki/Modules-and-the-Kernel#ninjectmodule-plugins:
var kernel = new StandardKernel(new NinjectSettings {LoadExtensions = false});
然后你必须动态加载扩展 - 这是通过加载它们来完成的NinjectModule
实施。例如:
IKernel.Load<FuncModule>();
当然FuncModule
你不想加载,我们正在做这一切来摆脱它。但是您必须为您真正想要的所有其他扩展模块执行此操作。
最后,您必须创建所需的所有工厂扩展绑定:
if (!this.Kernel.GetBindings(typeof(Func<IContext, IResolutionRoot>)).Any())
{
this.Bind<Func<IContext, IResolutionRoot>>().ToMethod(ctx => context => context.Kernel);
}
this.Bind<FuncProvider>().ToSelf().InSingletonScope();
this.Bind<IFunctionFactory>().To<FunctionFactory>();
this.Bind<IInstanceProvider>().To<StandardInstanceProvider>();
#if !SILVERLIGHT_20 && !WINDOWS_PHONE && !NETCF_35
this.Bind<IInterceptor>().To<FactoryInterceptor>()
.When(request => typeof(IFactoryProxy).IsAssignableFrom(request.Target.Member.ReflectedType));
#endif
Note:
如果您实际上正在使用 Func-Factories,我建议“忽略”该问题。如果问题再次出现,您现在知道该去哪里查找。
如果这是一个孤立的问题,您也可以更换您的Func<,>
通过接口,使事情更加明确(干净的代码)。
当然,无论如何这都不是一个完美的解决方案。这只是人们必须做出的艰难选择之一;-)