具有PerWebRequest生活方式的工厂方法

时间:2015-09-09 13:25:54

标签: c# .net castle-windsor

我正在使用Castle Windsor并尝试使用LifestylePerWebRequest。但是,我需要使用工厂方法来创建我的对象,所以我有以下注册。

Component.For<IMyComponent>()
         .UsingFactoryMethod(CreateMyComponent)
         .LifestylePerWebRequest()

当我在CreateMyComponent中放置一个断点时,我发现它在一次请求中会多次出现。这似乎不是PerWebRequest生活方式的正确行为。两者不相容吗?我在这里做错了什么?

2 个答案:

答案 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>

很抱歉,如果那没有多大帮助!如果你得到正确的配置等,看起来应该支持你想要做的事情。