【发布时间】:2017-10-11 09:16:03
【问题描述】:
这是我的场景的简化。
我有一些接口IFoo、IBar 和IBaz 以及它们的实现Foo、Bar 和Baz。
Foo 依赖于IBar 和Bar 依赖于IBaz,所以依赖图如下所示:
Foo
|
Bar
|
Baz
我的 Windsor 配置如下所示,一切正常:
container.Register(Component.For<IFoo>().ImplementedBy<Foo>());
container.Register(Component.For<IBar>().ImplementedBy<Bar>());
container.Register(Component.For<IBaz>().ImplementedBy<Baz>());
现在我需要引入一个新的SpecialBaz,当我的依赖关系图以Foo 开头时,我想使用它而不是旧的Baz。该应用的其余部分将继续使用旧的Baz:
Foo SomethingElse
| |
Bar Bar
| |
SpecialBaz Baz
我尝试用ServiceOverride api 命名SpecialBaz:
container.Register(Component.For<IBaz>().ImplementedBy<Baz>().IsDefault());
container.Register(Component.For<IBaz>().Named("special baz").ImplementedBy<SpecialBaz>());
container.Register(Component.For<IFoo>()
.ImplementedBy<Foo>()
.DependsOn(ServiceOverride.ForKey<IBaz>().Eq("special baz")));
并指定依赖:
container.Register(Component.For<IBaz>().ImplementedBy<Baz>().IsDefault());
container.Register(Component.For<IBaz>().ImplementedBy<SpecialBaz>());
container.Register(Component.For<IFoo>()
.ImplementedBy<Foo>()
.DependsOn(Component.For<IBaz>().ImplementedBy<SpecialBaz>()));
但是这两种方法都不起作用。
这在温莎城堡是否可行,我该如何接线?
【问题讨论】:
-
请在首次注册
IBaz时尝试删除IsDefault()。 -
是 IFoo 的 Foo 和 SomethingElse 实现吗?
-
@PhilDegenhardt 恐怕没有用。也不要忘记
Baz在这种情况下是IBaz的默认实现,其他人都应该是它的一个实例。当依赖关系图以Foo开头时,应该使用SpecialBaz。 -
@OgnyanDimitrov 不,
SomethingElse是一个不同的类,它也依赖于IBar -> IBaz依赖图。
标签: c# dependency-injection inversion-of-control castle-windsor