这部分是对尚未回答的同一问题的重复。见这里:How can I override a component registered in Castle Windsor?
由于我无法评论或发布现有问题的任何答案,我再次创建了这个问题,希望有人知道一个看似基本而简单的问题的答案。
请记住:
如果Castle Windsor无法提供这种简单的功能,您会推荐其他容器实现吗?
答案 0 :(得分:2)
温莎合作,##最后一次注册获胜#34;但是,如果您没有明确告诉它该组件将被覆盖,它将抛出异常。因此,有三种方法可以覆盖现有组件:
我个人更喜欢.IsDefault()并在我的集成测试中使用这个速记扩展:
public static class WindsorContainerExtensions
{
public static void Override<TService>(this IWindsorContainer container, TService instance) where TService : class
{
container.Register(Component.For<TService>().Instance(instance).IsDefault());
}
}
答案 1 :(得分:1)
我不知道其他容器,但Caslte所以我的答案是关于Castle。如果你想替换你可以做的是将一个扩展方法写入IWindsorContainer,它将删除然后添加。
但我认为你应该重新考虑一下你的设计:
您能否详细解释一下设计和相关课程?
答案 2 :(得分:0)
回答问题的第二部分 - 容器支持注册覆盖的内容。
<强> Ninject 强>
参见Bind()/ Unbind()方法。
我也试过Autofac,但似乎注册在构建后被冻结了。因此,使用Autofac似乎也不可能。
答案 3 :(得分:0)
像这样注册您的服务,然后您测试中的其他注册将覆盖它。
Container.Register(Component.For<ISomething>().ImplementedBy<RealSomething>().IsFallback());