Я вижу, что все ответы имеют свою точку зрения, и все они верны. Поэтому я могу лишь дать некоторые разъяснения по ним.
Вам следует выбрать момент утилизации объекта в зависимости от того, как вы его выставили. Например, ваш исходный код неявно предоставляет MpaContext db
для конвейера As pNet, и вы не можете распоряжаться db
, пока netcore не выполнит свою работу с ним. Таким образом, вы можете зарегистрировать утилизацию на Response.RegisterForDispose()
, как вы упомянули. Но это необычно, потому что у вас обычно нет доступа к Response
- вы можете сделать это только внутри Контроллера или если вы поделитесь им с зависимостями Контроллера, но это увеличит сложность кода.
Вот почему вы можно избежать этого, полагаясь на срок службы контроллера. Поскольку он находится в объеме запроса, он будет действовать до отправки ответа. Таким образом, вы можете создать свой db
как зависимость контроллера и сохранить его в свойстве. Также вы должны реализовать IDisposable
на контроллере.
public class RoleController : IDisposable
{
private MpaContext DbContext { get; }
public RoleController()
{
DbContext = new MpaContext();
}
[HttpGet( "ViewerRoles" )]
public IAsyncEnumerable<ViewerRole> GetViewList()
{
return DbContext.ViewerRoles.AsAsyncEnumerable();
}
public void Dispose()
{
DbContext.Dispose();
}
}
В этом случае вы можете придерживаться этого паттерна, даже если вы переместите свои логи c в какой-то другой класс (как это должно быть, я верить). Но все же, если вы вручную создаете одноразовые предметы, вам следует позаботиться об их утилизации. Это тот момент, когда DI приходит на помощь.
Используя DI, вы можете забыть об удалении объектов, созданных DI. DI вызовет Dispose()
для любой зависимости, когда закончится ее жизненный цикл. Зарегистрируйте свой MpaContext
, позвонив по номеру AddDbContextPool<MpaContext>()
или AddDbContext<MpaContext>()
, если вы используете EntityFramework в MpaContext
. При таком подходе вы получите чистый код вашего контроллера.
public class RoleController
{
private MpaContext DbContext { get; }
public RoleController( MpaContext dbContext )
{
DbContext = dbContext;
}
[HttpGet( "ViewerRoles" )]
public IAsyncEnumerable<ViewerRole> GetViewList()
{
return DbContext.ViewerRoles.AsAsyncEnumerable();
}
}
Если вы не хотите выставлять MpaContext
для контроллера и хотите создать его вручную внутри GetViewList()
, вы все равно можете перечислить результат в методе действия и распоряжаться контекстом, как ответил Теодор Зулиас. Но зачем, если вы можете просто поручить эту работу DI.