我正在和Ninject一起在家里玩一个简单的试验项目,只是为了看看我能用它做些什么。作为一个起点,我正在构建一个服务器的控制台运行器,它接受各种参数并根据它的内容,使用为流畅的接口提供的相同方法来配置要运行的模型。
例如,假设我有一个详细程度切换/o
。 /o
可以/o:quiet
,/o:normal
或/o:verbose
传递。各种选择都是不言自明的。
为了满足这个论点,我想附加ILogger
的各种实现 - quiet得到一个安静的记录器,只打印关键消息,normal得到一个普通的记录器,而verbose得到一个打印所有内容的健谈记录器。
我想做的是像以下模块中的内容:
Bind<ILogger>().To<QuietLogger>().When(VerbosityParameter=="quiet");
Bind<ILogger>().To<VerboseLogger>().When(VerbosityParameter=="verbose");
......等等。
我看不出怎样做这样的事情;所有条件绑定似乎都依赖于注入目标的状态。那是什么意思?当消费类必须详细指定确定给出的具体类型所需的所有条件时,它是否会破坏整个依赖注入点?为什么我不能告诉Ninject我想要什么,并得到它?
答案 0 :(得分:3)
ctx
参数只是contextual binding的一个输入 - 没有什么说你需要对它进行一点点关注(除了你需要与委托签名兼容的签名)。
请记住RRR pattern,但不要发疯。
你需要(在V2语法中这样做):
Bind<IWarrior>().To<Samurai>().When(_ => expression not involving context at all);
(其中_
是穷人的pidgin使用F#模式匹配语法来忽略输入)
答案 1 :(得分:3)
在这种特殊情况下,我不会替换记录器实例,而是配置您的日志记录框架以准确记录您想要的内容。
When
条件也不依赖于您可以放置任何条件的目标。 E.g。
When(ctx => Configuration.Get("VerborsityLevel") == "quiet")