【问题标题】:Castle Windsor 3 persists PerWebRequest objects across multiple web requestsCastle Windsor 3 在多个 Web 请求中保留 PerWebRequest 对象
【发布时间】:2012-07-31 07:11:12
【问题描述】:

我有一个 MVC 4 项目,并试图将 PerWebRequest 对象注入我的控制器。但是,似乎没有跨多个请求重新创建对象

 private static IWindsorContainer InitializeWindsor()
    {
        var container = new WindsorContainer().Install(FromAssembly.This());

        // Add Factory facility
        container.AddFacility<TypedFactoryFacility>();

        // Register all controllers from this assembly
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            container.Register(
                AllTypes.FromAssembly(assembly).BasedOn<Controller>().Configure(c => c.LifestyleTransient())
                );
        }

        // Register HTTP Handlers
        container.Register(Component.For<HttpRequestBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpRequestWrapper(HttpContext.Current.Request)));
        container.Register(Component.For<HttpContextBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));


        // Register components
        container.Register(Component.For<PerWebRequestObject>().LifeStyle.PerWebRequest);
}

这是我的 PerWebRequestObject:

public class PerWebRequestObject
{
    public DateTime DateCreated { get; set; }

    public PerWebRequestObject()
    {
        DateCreated = DateTime.UtcNow;
        Debug.WriteLine("Created: " + DateCreated.ToLongTimeString());
    }
}

这是我的测试控制器:

public class TestController : BaseController
{
    public PerWebRequestObject pwrObject { get; set; }

    public ActionResult Test()
    {
        Debug.WriteLine(pwrObject.DateCreated.ToLongTimeString());
        return new ContentResult();
    }
}

为什么这不起作用?请注意,我正在使用 WindsorControllerFactory 并像这样释放控制器:

    public override void ReleaseController(IController controller)
    {
        var disposableController = controller as IDisposable;
        if (disposableController != null)
            disposableController.Dispose();

        _windsorContainer.Release(controller);
    }

【问题讨论】:

  • 谢谢 - 刚刚试过这个,它肯定每次都会产生一个新的请求,并创建一个新的控制器......不知道为什么我的 PerWebRequestObject 表现得像一个单身人士。是否可能与我使用 MVC4 测试版有关?

标签: asp.net castle-windsor perwebrequest


【解决方案1】:

两件事:

  • 您如何知道对象的生命周期未正确(未跨网络请求重新创建)?

一种可能的解释是你的依赖看起来像这样:

controller --> 一个单例 --> 你的 per-web-request-component

这是生活方式的不匹配,这可以解释你所看到的行为

  • 不要丢弃控制器。这是容器的工作。

【讨论】:

    【解决方案2】:

    升级到 Castle Windsor v3.1 为我们解决了这个问题,无需更改任何代码。

    我认为 Windsor v3.0 + MVC 4 的组合一定存在问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2015-10-03
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多