在使用带有Castle Windsor的ASP.NET时,组合根应该是瞬态还是按请求?

时间:2012-03-18 16:15:42

标签: asp.net dependency-injection castle-windsor

按照“.NET中的依赖注入”中的建议,我正在解析每个页面构造函数中的组合根,如下所示:

public MyPageConstructor()
{
    var container = (Castle.Windsor.WindsorContainer)HttpContext.Current.Application["DIcontainer"];
    Controller = container.Resolve<MyPageController>();
}

现在,如果我将控制器设置为瞬态,我必须在卸载页面时手动释放它。如果我按照请求制作,Castle会在请求结束时为我发布但是可能会有性能损失,我不确定。目前,我倾向于使对象瞬态并自行处理释放。

还有其他需要考虑的事项以及推荐的做法是什么?

谢谢。

2 个答案:

答案 0 :(得分:2)

我建议使用尽可能长的使用寿命。不幸的是,复杂的应用程序可以有多个入口点,Resolve方法调用了这些入口点。如果您选择Transient,则存在每个请求多次创建某些服务的风险。例如,某些HttpModule可以使用与Page相同的服务。使用PerRequest生命周期可以避免此类问题。

答案 1 :(得分:0)

这取决于,如果你有一个对它有很多依赖的类,那么一遍又一遍地实例化同一个东西的开销可能会很严重。但如果有一些不是线程安全的东西,你最好是短暂的。