2016-06-22 4 views
3

Если я создаю контроллер IDisposable, я предполагаю, что метод Dispose все еще не будет вызываться GC. Значит, я должен был бы добавить:Контроллеры и IDisposable

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

protected override void Dispose(bool disposing) 
{ 
    if (!isDalDisposed) 
    { 
     isDalDisposed = true; 
     if (disposing) 
      DAL.Dispose(); 
    } 
    base.Dispose(disposing); 
} 

Я прочитал, что использование Object.Finalize является плохой практикой и следует избегать, где это возможно.

Проблема заключается в том, что мои «службы» создаются в конструкторе по умолчанию, который не позволяет мне использовать оператор using для управления временем жизни каждой службы. Итак, каков был бы правильный способ справиться с этой проблемой?

+0

Вы используете ASP.NET MVC? –

+2

какие контроллеры вы говорите? В WebAPI контроллеры создаются для каждого запроса, поэтому нет необходимости явно указывать. –

+0

Да, я говорю о веб-контроллерах api. У меня есть некоторые сервисы, которые являются одноразовыми, и я создаю их в конструкторе. Мне нужно избавиться от них, когда они закончены, но я пытаюсь найти способ сделать это, который не использует метод финализации, потому что я читал, что это плохая практика. – r3plica

ответ

6

Web API ApiController уже реализован IDisposable и предоставляет удобный виртуальный метод для переопределения разработчиков, который является используемым методом Dispose(bool). Итак, все, что вам нужно сделать, это удалить свой собственный логический флаг и просто проверить только параметр disposing.

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     DAL.Dispose(); 
    } 
    base.Dispose(disposing); 
} 
3

Если вы можете переопределить protected void Dispose(bool disposing), это будет означать, что базовый класс использует Disposable pattern и уже реализует IDisposable.

Просто удалите интерфейс IDisposable и метод public void Dispose(), и он должен работать.

1

Есть ли какая-либо конкретная причина, почему вы создаете сервис в конструкторе?

Поскольку контроллер запрограммирован по запросу, вы можете создать службу в самом действии в блоке «using». Продолжительность службы не ограничена действиями.

+0

И связанная с этим возможность будет вводить фабрику услуг в конструктор контроллера, а затем использовать инжектированную фабрику в рамках действия для создания службы. Обратите внимание, что сам инжектируемый завод не должен реализовывать 'IDisposable' и поэтому должен быть удален. (Хотя, если бы это было так, его утилизация, вероятно, была бы ответственностью инжектора). – DavidRR