ASP.NET MVC ViewResult вопрос - PullRequest
1 голос
/ 03 июня 2009

Законно ли, чтобы ваш класс ASP.NET MVC ViewResult реализовывал IDisposable? У моего пользовательского результата просмотра есть элемент потока, который, я хочу гарантировать, будет закрыт, как только он будет передан обратно клиенту. Признает ли ASP.NET MVC IDiposable в реализациях ViewResult?

спасибо!

Ответы [ 2 ]

2 голосов
/ 03 июня 2009

ViewResult не реализует интерфейс IDisposable. Посмотрите на ASP.NET MVC источник :

ViewResult.cs:

namespace System.Web.Mvc {
    using System;
    using System.Globalization;
    using System.Text;
    using System.Web.Mvc.Resources;

    public class ViewResult : ViewResultBase {
...

ViewResultBase.cs:

namespace System.Web.Mvc {
    using System;
    using System.Diagnostics.CodeAnalysis;

    public abstract class ViewResultBase : ActionResult {
...

ActionResult.cs:

namespace System.Web.Mvc {

    public abstract class ActionResult {

        public abstract void ExecuteResult(ControllerContext context);

    }

}

ОБНОВЛЕНИЕ:

Если вы реализуете интерфейс IDisposable в своем классе (производном от ViewResult), Dispose () (IDisposable.Dispose ()) не будет вызываться средой ASP.NET MVC.

0 голосов
/ 04 июня 2009

Если вы хотите это поведение, вы можете получить его, расширив ControllerActionInvoker. Я считаю, что вы можете сделать что-то вроде:

// warning: untested
public class DisposableControllerActionInvoker : ContollerActionInvoker
{
  public override void InvokeActionResult(
      ControllerContext controllerContext, ActionResult actionResult) 
  {
    base.InvokeActionResult(controllerContext, actionResult);
    var disposable = actionResult as IDisposable;
    if(disposable != null) 
    {
      disposable.Dispose();
    }
  }
}

Затем вам нужно будет добавить свой ControllerActionInvoker в контроллер, что можно сделать с помощью фабрики пользовательских контроллеров (возможно, есть более простой способ, но я не знаком).

...