Метод утилизации в веб-сервисе web api 2

Я кодирую интернет-приложение MVC 5 с веб-сервисом web api 2. Нужен ли метод dispose для класса DbContext в веб-сервисе? Это не там по умолчанию.

2 ответа

На самом деле, System.Web.Http.ApiController уже реализует IDisposable:

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the  project root for license information.
// ...
public abstract class ApiController : IHttpController, IDisposable
{
// ...
    #region IDisposable

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
    }

    #endregion IDisposable
}

Итак, если ваш контроллер содержит DbContext, сделайте следующее:

public class ValuesController : ApiController
{
    private Model1Container _model1 = new Model1Container();

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_model1 != null)
            {
                _model1.Dispose();
            }
        }
        base.Dispose(disposing);
    }
}

В Web Api 2 вы можете зарегистрировать компонент для удаления, когда запрос выходит за рамки. Метод называется "RegisterForDispose" и является частью запроса. Размещаемый компонент должен реализовывать IDisposable.

Лучший подход - создать свой собственный метод расширения, как показано ниже...

       public static T RegisterForDispose<T>(this T toDispose, HttpRequestMessage request) where T : IDisposable
   {
       request.RegisterForDispose(toDispose); //register object for disposal when request is complete
      return toDispose; //return the object
   }

Теперь (в вашем контроллере API) вы можете зарегистрировать объекты, которые вы хотите использовать при завершении запроса...

    var myContext = new myDbContext().RegisterForDispose(Request);

Ссылки... https://www.strathweb.com/2015/08/disposing-resources-at-the-end-of-web-api-request/

Другие вопросы по тегам