使用StructureMap,可以执行解析并强制容器使用在解析时提供的特定依赖项实例,如下所示:
ObjectFactory.With<ISomeDependency>(someDepedencyInstance).GetInstance<IServiceType>()
提供的实例将用于整个解析链,它不仅是IServiceType实现的直接依赖,也是IServiceType实现的任何直接和间接依赖的依赖。
如何在Castle Windsor做类似的事情?
我知道我可以通过IWindsorContainer.Resolve&lt;&gt;()的重载提供直接依赖,但是我需要将这种依赖提供给更深层次的东西。
答案 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的注册。所有其他注册都使用父母。