我正在使用Castle Windsor并尝试使用LifestylePerWebRequest
。但是,我需要使用工厂方法来创建我的对象,所以我有以下注册。
Component.For<IMyComponent>()
.UsingFactoryMethod(CreateMyComponent)
.LifestylePerWebRequest()
当我在CreateMyComponent
中放置一个断点时,我发现它在一次请求中会多次出现。这似乎不是PerWebRequest生活方式的正确行为。两者不相容吗?我在这里做错了什么?
答案 0 :(得分:1)
尝试将此添加到您的Global.asax.cs文件中,以验证每个Web请求多次调用CreateMyComponent(它不应该):
protected void Application_BeginRequest(object sender, EventArgs args)
{
System.Diagnostics.Debug.WriteLine(this.Request.RequestType + " " + this.Request.RawUrl);
}
在CreateMyComponent方法和Application_BeginRequest方法中都放置一个断点。调试器应首先停在Application_BeginRequest方法,然后停在CreateComponent方法。它不应再次进入CreateComponent方法,除非它首先进入Application_BeginRequest方法。
也许你有一些ajax或其他资源可以“每页加载”生成多个请求,从而使得看起来Windsor每个Web请求多次调用您的工厂方法。这将告诉是否是这种情况。
如果确实每个HTTP请求多次调用您的方法,则可能是缺乏配置,正如另一个答案所暗示的那样。
答案 1 :(得分:0)
Castle自己的documentation使用带有工厂方法的网络请求生活方式,因此它们应该兼容。
该部分的其余部分继续讨论使用PerWebRequest
时的其他注意事项,因此可能值得一读。特别是:
我们必须打开我们的web.config文件,找到它的system.web部分,然后添加以下内容:
<httpModules>
<add name="PerRequestLifestyle"
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
</httpModules>
很抱歉,如果那没有多大帮助!如果你得到正确的配置等,看起来应该支持你想要做的事情。