Ninject条件绑定

时间:2011-12-05 20:36:44

标签: dependency-injection inversion-of-control ninject

我正在和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我想要什么,并得到它?

2 个答案:

答案 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")