覆盖Castle Windsor的组件注册?哪个容器支持它?

时间:2016-06-13 16:08:38

标签: c# castle-windsor

这部分是对尚未回答的同一问题的重复。见这里:How can I override a component registered in Castle Windsor?

由于我无法评论或发布现有问题的任何答案,我再次创建了这个问题,希望有人知道一个看似基本而简单的问题的答案。

请记住:

  1. 我不想创建新容器。
  2. 我不在乎容器是否不应用于单元测试。
  3. 我不想使用派生容器。
  4. 如果Castle Windsor无法提供这种简单的功能,您会推荐其他容器实现吗?

4 个答案:

答案 0 :(得分:2)

温莎合作,##最后一次注册获胜#34;但是,如果您没有明确告诉它该组件将被覆盖,它将抛出异常。因此,有三种方法可以覆盖现有组件:

  1. 使用.IsDefault()注册组件。这将覆盖现有注册。
  2. 使用.IsFallback()注册组件。这将允许组件 稍后重写。
  3. 使用组件的唯一名称 - .Named(" NewComponentName")。
  4. 我个人更喜欢.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,它将删除然后添加。

但我认为你应该重新考虑一下你的设计:

  1. 为什么您的班级需要直接访问容器并尝试自行解决?
  2. 为什么需要更改测试代码的源代码?如果根据SOLID编写干净的依赖注入代码,那么你的测试真的会非常神奇地&#34;流动。
  3. 您能否详细解释一下设计和相关课程?

答案 2 :(得分:0)

回答问题的第二部分 - 容器支持注册覆盖的内容。

<强> Ninject

参见Bind()/ Unbind()方法。

我也试过Autofac,但似乎注册在构建后被冻结了。因此,使用Autofac似乎也不可能。

答案 3 :(得分:0)

像这样注册您的服务,然后您测试中的其他注册将覆盖它。

Container.Register(Component.For<ISomething>().ImplementedBy<RealSomething>().IsFallback());