Dependency injection 温莎城堡相当于StructureMap ObjectFactory。带有<&燃气轮机;()GetInstance<&燃气轮机;()

Dependency injection 温莎城堡相当于StructureMap ObjectFactory。带有<&燃气轮机;()GetInstance<&燃气轮机;(),dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,使用StructureMap,可以执行解析并强制容器使用解析时提供的特定依赖项实例,如下所示: ObjectFactory.With<ISomeDependency>(someDepedencyInstance).GetInstance<IServiceType>() ObjectFactory.With(someDependencyInstance).GetInstance() 提供的实例将在整个解析链中使用,该解析链不仅作为IServiceType实现的直接依赖项

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

ObjectFactory.With<ISomeDependency>(someDepedencyInstance).GetInstance<IServiceType>()
ObjectFactory.With(someDependencyInstance).GetInstance()
提供的实例将在整个解析链中使用,该解析链不仅作为IServiceType实现的直接依赖项,还作为IServiceType实现的任何直接和间接依赖项的依赖项

在温莎城堡,我该怎么做这样的事?


我知道我可以通过IWindsorContainer.Resolve()重载提供直接依赖关系,但我需要提供更深层次的依赖关系。

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

container.Register(Component
    .For<ISomeDependency>()
    .Instance(someDependencyInstance));
已解析的
服务
将包含SomeOtherDependency而不是SomeDependency的实例


请注意,
childContainer
如何仅覆盖等距依赖项的注册。所有其他注册都从父级使用。

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

container.Register(Component
    .For<ISomeDependency>()
    .Instance(someDependencyInstance));
已解析的
服务
将包含SomeOtherDependency而不是SomeDependency的实例


请注意,
childContainer
如何仅覆盖等距依赖项的注册。所有其他注册都从父级使用。

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

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")));
var容器=新的WindsorContainer();
container.Register(Component.For())
.ImplementedBy());
container.Register(Component.For())
.由()实施
。命名为(“其他”);
container.Register(Component.For())
.由()实施
.ServiceOverrides(ServiceOverride.ForKey(“dep”).Eq(“其他”));

有关服务覆盖的更多信息,请参阅。

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

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")));
var容器=新的WindsorContainer();
container.Register(Component.For())
.ImplementedBy());
container.Register(Component.For())
.由()实施
。命名为(“其他”);
container.Register(Component.For())
.由()实施
.ServiceOverrides(ServiceOverride.ForKey(“dep”).Eq(“其他”));

有关服务覆盖的更多信息,请参阅。

我知道这一点,但我的需求不同。假设我在容器中注册了ISomeDependency,但是对于某些特定的单个解析,我希望强制执行在解析时提供的特定实例(不同于已注册的实例)。是的,谢谢Mark,就是这样。尽管我必须说StructureMap让这个特定场景变得更容易。另外,如何摆脱子容器(使其可用于GC)?我只是让它离开作用域,还是应该将Parent设置为null,或者调用container.RemoveChildContainer(childContainer)?WindsorContainer实现IDisposable,因此正确的做法是调用其Dispose方法,但首先通过调用RemoveChildContainer将其从父级中删除。我知道这一点,但我的需求不同。假设我在容器中注册了ISomeDependency,但是对于某些特定的单个解析,我希望强制执行在解析时提供的特定实例(不同于已注册的实例)。是的,谢谢Mark,就是这样。尽管我必须说StructureMap让这个特定场景变得更容易。另外,如何摆脱子容器(使其可用于GC)?我是让它离开作用域,还是应该将Parent设置为null,或者调用container.RemoveChildContainer(childContainer)?WindsorContainer实现IDisposable,因此正确的做法是调用其Dispose方法,但首先通过调用RemoveChildContainer将其从父级中删除。我不确定OP是问这个问题。这将对所有创建的iSeries设备实例使用“其他”。我想问题是你是否可以覆盖特定解析调用的行为,但我可能错了……关键是覆盖特定解析调用的行为。通常覆盖是在注册时完成的,而不是在解析时完成的。我不确定OP问的是什么。这将对所有创建的iSeries设备实例使用“其他”。我认为问题是您是否可以覆盖特定解析调用的行为,但我可能错了……重点是覆盖特定解析调用的行为。通常覆盖是在注册时完成的,而不是在解析时完成的。您能否进一步解释您试图实现的目标?现在还不太清楚,通常覆盖是在注册时完成的,而不是在解析时。你能进一步解释一下你想要实现什么吗?不太清楚,通常覆盖是在注册时完成的,而不是在解析时完成的。