在温莎城堡中没有与控制器一起发布的依赖关系?

时间:2013-06-26 21:00:14

标签: dependency-injection castle-windsor

我有一个依赖项(比如IServiceRetriever)我的控制器调用它依次调用另一个依赖项。我可以验证我的控制器是在我的“_container.Release(controller)”调用期间释放的,但是我的依赖关系没有被释放。我知道这一点,因为如果我再次调用控制器,这个依赖项的公共属性会不断添加项目(列表是在构造函数中创建的,所以如果创建一个新实例,它将是一个新列表)。 p>

我将我的控制器注册为LifetimeTransient,并且我没有与我的依赖关联的生活方式:

container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());

container.Register(Classes.FromAssemblyContaining<IServiceRetriever>()
                .Where(x => x.IsPublic)
                .WithServiceDefaultInterfaces()); //dependency that calls IQueryBuilder

container.Register(Component.For<IQueryBuilder>().ImplementedBy<QueryBuilder>()); // not being released

我以前从未见过这个,我假设如果我释放控制器,Windsor会走依赖图并处理它找到的所有内容,但实际情况并非如此。我在这里错过了什么?

1 个答案:

答案 0 :(得分:2)

  

我以前从未见过这个,我假设如果我   释放控制器,温莎将走依赖图和   处置它找到的所有东西,情况并非如此。

如果您的依赖项使用单例生命周期,则此假设是错误的。 Castle Windsor中的默认生命周期是单例,您已使用默认生命周期注册了IServiceRetriever和IQueryBuilder。在处置容器之前,不会释放单例对象。如果你在没有对象持有对它的引用时释放它,你可能必须稍后创建另一个并且它不再是单例。