2016-06-22 1 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

웹 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

생성자에서 서비스를 만드는 특별한 이유가 있습니까?

요청 당 컨트롤러가 인스턴스화되므로 '사용'블록 내에서 작업 자체에서 서비스를 만들 수 있습니다. 서비스의 수명은 행동으로 제한됩니다.

+0

그리고 관련된 가능성은 컨트롤러 생성자에 서비스 팩토리를 주입 한 다음 액션 내에 주입 된 팩토리를 사용하여 서비스를 생성하는 것입니다. 주입 된 팩토리 자체는 'IDisposable'을 구현해서는 안되며, 따라서 처리해야합니다. (그렇더라도 그 폐기는 틀림없이 인젝터의 책임 일 것입니다.) – DavidRR