Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Would MVC call Dispose if your ViewModel was IDisposable?

Suppose you do not have control over object creation and disposal. There are some circumstances where you don't.

Take the instance of MVC. Suppose you had something like this:

interface IFoo : IDisposable { }

class HomeController
{
    private IFoo _foo = null;

    HomeController(IFoo foo)
    {
        _foo = foo;
    }

    ActionResult Index()
    {
        return View(_foo);
    }
}

Once your object is passed to the View, you pretty much lose control over it.

In this case, I can only think of two ways to mitigate this scenario:

1) If it hurts, don't do it. In other words, don't let what you give to your views be IDisposables.

2) Or, same as 1 but if you do receive an IDisposable and you want to pass it to the view, don't pass the IDisposable as such. Cast, even if it involves a copy of all data, to something that's not IDisposable and call the Dispose() yourself. For e.g. like so:

ActionResult Index()
{
    using(_foo)
    {
      return View((FooViewModel)_foo);
    }
}

But I am curious. Does MVC check for IDisposable and call it on any state received by the View once it is done rendering the View?

like image 257
Water Cooler v2 Avatar asked May 28 '14 02:05

Water Cooler v2


People also ask

Is Idisposable called automatically?

By default, the garbage collector automatically calls an object's finalizer before reclaiming its memory. However, if the Dispose method has been called, it is typically unnecessary for the garbage collector to call the disposed object's finalizer.

What is MVC dispose?

The Dispose method leaves the Controller instance in an unusable state. After you call Dispose, you must release all references to the Controller instance so that the garbage collector can reclaim the memory that the Controller instance was occupying.

Why do we use ViewModel in MVC?

ViewModel = Model that is created to serve the view. ASP.NET MVC view can't have more than one model so if we need to display properties from more than one model in the view, it is not possible. ViewModel serves this purpose. View Model is a model class that can hold only those properties that are required for a view.

How do I bypass ViewModel?

Passing Data between fragments in Android using ViewModel: This is because ViewModel is tied to the activity lifecycle. To actually pass the data between fragments, we need to create a ViewModel object with an activity scope of both the fragments, initialize the ViewModel , and set the value of the LiveData object.


1 Answers

The ASP.NET MVC Controller class already implements IDisposable. If you have further cleanup that needs done after the request executes, you can override the Dispose method. In your example, it would look something like:

public class HomeController
{
    private IFoo _foo = null;

    // Your code as usual
    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
        if(disposing && _foo != null)
            _foo.Dispose();
    } 
}
like image 193
Justin Niessner Avatar answered Sep 21 '22 13:09

Justin Niessner