Метод утилизации в веб-сервисе 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/