Castle Windsor相当于StructureMap ObjectFactory.With<>()。GetInstance<>()

时间:2009-12-29 11:41:55

标签: dependency-injection castle-windsor

使用StructureMap,可以执行解析并强制容器使用在解析时提供的特定依赖项实例,如下所示:

ObjectFactory.With<ISomeDependency>(someDepedencyInstance).GetInstance<IServiceType>()

提供的实例将用于整个解析链,它不仅是IServiceType实现的直接依赖,也是IServiceType实现的任何直接和间接依赖的依赖。

如何在Castle Windsor做类似的事情?

我知道我可以通过IWindsorContainer.Resolve&lt;&gt;()的重载提供直接依赖,但是我需要将这种依赖提供给更深层次的东西。

2 个答案:

答案 0 :(得分:1)

您可以使用命名组件和服务覆盖:

var container = new WindsorContainer();
container.Register(Component.For<ISomeDependency>()
    .ImplementedBy<SomeDependency>());
container.Register(Component.For<ISomeDependency>()
    .ImplementedBy<SomeOtherDependency>()
    .Named("other"));
container.Register(Component.For<IService>()
    .ImplementedBy<Service>()
    .ServiceOverrides(ServiceOverride.ForKey("dep").Eq("other")));

有关服务覆盖的详细信息,请参阅this article

答案 1 :(得分:0)

您可以将实例注册为给定组件的实现,如下所示:

container.Register(Component
    .For<ISomeDependency>()
    .Instance(someDependencyInstance));

这意味着每次解析任何并且ISomeDependency是已解析对象图的一部分时,将使用someDependencyInstance实例。

这是你想要的,还是我误解了这个问题?


根据其他信息,这是回答问题的新尝试。

您应该可以使用容器层次结构。如果Windsor容器无法解析类型,它将询问其父级。这意味着您可以创建仅包含覆盖的子容器,然后让该容器为您解析类型。

以下是一个例子:

var container = new WindsorContainer();
container.Register(Component
    .For<ISomeDependency>()
    .ImplementedBy<SomeDependency>());
container.Register(Component
    .For<IService>()
    .ImplementedBy<Service>());

var childContainer = new WindsorContainer();
childContainer.Register(Component
    .For<ISomeDependency>()
    .ImplementedBy<SomeOtherDependency>());

childContainer.Parent = container;

var service = childContainer.Resolve<IService>();

已解析的service将包含SomeOtherDependency的实例,而不包含SomeDependency。

注意childContainer如何仅覆盖ISomeDependency的注册。所有其他注册都使用父母。