我可以同时使用命名绑定和未命名绑定吗?

本文关键字:绑定 未命名 我可以 | 更新日期: 2023-09-27 18:07:57

我遇到过这样的情况:一个类需要特定注入的两个实例——一个是通用的,另一个是专门化的(通用的也可以是专门化的,但不一定)。

我的直觉是这样做的:

Bind<IAmAThing>().To<AGeneralThing>();
Bind<IAmAThing>().To<ASpecializedThing>().Named("Special");
然后使用像 这样的构造函数
MyClass(IAmAThing generalThing, [Named("Special")]IAmAThing specializedThing) {

但我不确定这是否会起作用,如果它起作用,它是否会一直起作用,或者是否有另一种方法来做我正在想的事情。本质上,如果我不命名一个实例,它会退回到未命名的实例吗?是否有像这样指定默认值的方法?

当然我可以命名这两个实例,但似乎这将是一个痛苦的道路,当有人认为他们可以请求一个实例…

我可以同时使用命名绑定和未命名绑定吗?

当您使用命名绑定时,请求也必须有一个名称—并且它必须是精确匹配的。没有退回到未命名绑定。你确定你的设计需要这个吗?对于接口的使用者来说,他被注入的实例有什么关系?看起来很复杂,似乎隐藏了一些东西…

看起来Niject接受这两个绑定,但是当调用Resolve<>()时,它抛出一个异常,抱怨有两个或更多的绑定。我的解决方法是让所有绑定到同一个接口都有具体的名称。另一个问题是,在解析命名绑定时,名称不会向下游传播,因此也必须手动实现。不是很好。