2

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

我将我的控制器注册为 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 会遍历依赖关系图并处理它找到的所有内容,但事实并非如此。我在这里想念什么?

4

1 回答 1

2

我以前从未见过这种情况,我假设如果我释放控制器,Windsor 会遍历依赖关系图并处理它找到的所有内容,但事实并非如此。

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

于 2013-06-26T21:43:52.190 回答