是的,注册没有接口的组件是可以的,但是不是因为你给出的原因.
具体的依赖关系
组件可能依赖于具体的类。例如,对于实体框架,消费者应该将 ObjectContext 注入其中。这是一个仍然需要注入的具体类,因为它应该是shared多个消费者之间。
因此,给定一个消费者的构造函数如下:
public FooRepository(FooObjectContext objectContext)
您需要像这样配置容器:
container.Register(Component.For<FooObjectContext>());
Foo 存储库不请求任何接口因此注册一个接口是没有意义的(即使有一个接口可用),但您仍然必须注册具体类,因为 Windsor 可以只解析显式注册的类型.
仅具有一种实现的接口
那么只有一种实现的接口又如何呢?消费者再次决定需求。
想象一下消费者有这个构造函数:
public Ploeh(IBar bar)
温莎城堡能够解决 Ploeh 的唯一方法是注册 IBar。即使 Bar 是 IBar 的唯一实现,这行不通:
container.Register(Component.For<Bar>());
这不起作用,因为 IBar 从未注册。 Castle Windsor 并不关心 Bar 实现 IBar,因为它不想代表您变得聪明。你必须明确地告诉它:
container.Register(Component.For<IBar>().ImplementedBy<Bar>());
This maps酒吧到酒吧。
注册接口和具体类型
那么如果您希望能够同时解析具体类型和接口怎么办?
上一个示例的问题在于,它可以让您解析 IBar,但不能解析 Bar。
您可以使用 Forward 方法或 For 的多泛型重载来转发注册:
container.Register(Component.For<Bar, IBar>().ImplementedBy<Bar>());
这可以让你解决both酒吧和 IBar。