C# 停止Ninject绑定Func<;T、 T,bool>;自动地
我有一个PriorityQueue,它将Func作为构造参数C# 停止Ninject绑定Func<;T、 T,bool>;自动地,c#,dependency-injection,ninject,func,C#,Dependency Injection,Ninject,Func,我有一个PriorityQueue,它将Func作为构造参数 public PriorityQueue(ISomeOtherInjectedThing other, Func<T, T, bool> cmp_func) {...} 如何让Ninject按预期抛出异常,而不是静默地生成要注入的Func 到Func工厂的Func自动绑定是Ninject.Extensions.Factory的一项功能。见资料来源: 如果为Func创建特定绑定,它仍将覆盖由FuncModule创建的通用
public PriorityQueue(ISomeOtherInjectedThing other, Func<T, T, bool> cmp_func) {...}
如何让Ninject按预期抛出异常,而不是静默地生成要注入的Func 到Func工厂的Func自动绑定是Ninject.Extensions.Factory的一项功能。见资料来源: 如果为
Func
创建特定绑定,它仍将覆盖由FuncModule
创建的通用绑定。但正如您所注意到的,如果不创建特定绑定,就不会有任何异常
摆脱默认(开放)绑定的最简单方法是摆脱工厂扩展
但这可能有点过激。您还可以做的是禁用:
然后,您必须动态加载扩展—这是通过加载它们的NinjectModule
实现来完成的。例如:
IKernel.Load<FuncModule>();
注意:
如果您实际使用的是Func工厂,我建议您“忽略”这个问题。如果问题再次出现,你现在知道该往哪里看了。
如果这是一个孤立的问题,您还可以用接口替换Func
,使事情更加明确(干净的代码)。
当然,这无论如何都不是一个完美的解决方案。这只是一个人必须做出的艰难选择之一;-) 我是否正确理解了这一点:如果我只是停止使用工厂扩展(=不安装工厂扩展nupkg),问题就会消失?但我也认为工厂扩展提供了一些非常有价值的功能。因此,我要么用特定的接口替换
Func
,要么通过禁用自动加载并为工厂扩展创建自定义绑定集来使用扩展的“一半”——如答案中所述。这对我不起作用。PriorityQueue comparison func不是要绑定的,而是在代码中指定的(因为所有对象可能都有=comparison)。我们代码中的错误是工厂方法是Create()而不是Create(Func),并且由于缺少异常抛出而没有被发现。我觉得这是工厂扩展中的一个bug,因为“将默默地为Func提供绑定”的行为肯定不是大多数用户所期望的。我同意如果是选择加入行为(可能是单独的nuget包Ninject.extensions.FuncFactory)而不是选择退出会更好。是的,这还远远不够完美。只使用扩展的“一半”(noFunc
binding)对您仍然有效,但需要一些工作(手动加载所有扩展模块)。AFAIK AutoFac和Unity在Func
和Lazy
方面表现相同-它们也是“自动绑定”的。
Ninject.dll!Ninject.KernelBase.Resolve.AnonymousMethod__c(Ninject.Planning.Bindings.IBinding binding) Line 386 + 0x5a bytes C#
var kernel = new StandardKernel(new NinjectSettings {LoadExtensions = false});
IKernel.Load<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