2017-09-26 7 views
0

다음 구조가 있습니다. 내가 헷갈리는 것은 PhoneBase을 처분하는 방법이다. Unity가 PhoneBase을 처분하는지는 모르겠다.Unity에서 기본 클래스를 처리하는 가장 좋은 방법은 무엇입니까

public class PhoneBase : IDisposable 
{ 
    protected int GetSignal() 
    { 
    } 

    //something needs to dispose 
    public void Dispose() 
    { 
    } 
} 

public interface IMyPhone 
{ 
    void SwitchOn(); 
    void SwitchOff(); 
} 

public class MyPhone : PhoneBase, IMyPhone 
{ 
    public void SwitchOn() 
    { 
     //implement 
    } 

    public void SwitchOff() 
    { 
     //implement 
    } 

} 

public class PhoneQuestionController : Controller 
{ 
    IMyPhone myPhone; 
    public PhoneQuestionController(IMyPhone myPhone) 
    { 
     this.myPhone = myPhone; 
    } 
} 

나는 다음과 같은 컨트롤러의 Dispose을 무시하면서 다음을 호출 IMyPhone 인터페이스에서 Dispose 방법을 넣어해야 하는가? 아니면 더 좋은 방법이 있을까요?

public interface IMyPhone 
{ 
    void SwitchOn(); 
    void SwitchOff(); 
    void Dispose(); 
} 

public class PhoneQuestionController : Controller 
{ 
    IMyPhone myPhone; 
    public PhoneQuestionController(IMyPhone myPhone) 
    { 
     this.myPhone = myPhone; 
    } 

    override Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     myPhone.Dispose(); 
    } 
} 
+0

"Unity가 PhoneBase를 처분할지 모르겠습니다." 무슨 일이 일어 났는지 보려고 했니? – Steven

+0

유니티는 처분과 아무 관련이 없습니다. 요청이 끝날 때 컨트롤러 인스턴스를 삭제하는 것은 MVC 파이프 라인입니다. 이것은 두 번째 버전이 정확하다는 것을 의미합니다. ASP.NET 파이프 라인은 컨트롤러에서'Dispose '를 호출하고 사용자 정의 객체에서'Dispose'를 호출합니다. –

답변

2

나는 IDisposable의 목적을 이해한다고 생각하지 않습니다. 은 자체가 처분 할 수있는 리소스를 소유하는 경우 클래스는 IDisposable 만 구현해야합니다. 즉, 클래스가 실질적으로 새로운 것, 이 아닌이 주입되어야 함을 의미합니다. 클래스는 주입 된 리소스를 처리해서는 안됩니다. 그것이 개체 수명 관리자의 작업입니다 -이 경우 유니티.

PhoneBase은 실제로 일회용 리소스를 소유하고 있다고 가정하면 MyPhone은이 리소스와 IDisposable 구현을 상속합니다. 사실이 시나리오에서는 PhoneBase이 실제로 존재하지 않습니다. MyPhone처럼 어떤 식 으로든 PhoneBase 인스턴스에 대한 내부 참조가 없습니다. 가지고있는 것은 PhoneBase과 동일한 속성 및 메서드가 있고 그 위에 특별히 정의 된 것 이외에 MyPhone 인스턴스입니다.

그런 다음 IMyPhone 대신 MyPhone을 삽입하면 Unity는 해당 객체를 소유하는 엔터티이므로 해당 객체를 처리하는 책임이 있습니다 (수명 만료시, DI 구성에서 정의). 컨트롤러가 이 아니어야합니다.을 처분하십시오. 기간. 컨트롤러는 그것을 소유하지 않으며 유니티가 다른 곳으로 주입하는 경우 객체가 부적절하게 처리되었으므로 다른 인스턴스에서 예외가 발생합니다.

부수적으로, 부적절하게 구현하고 IDisposable을 사용해야 만하는 객체를 처리하지 않는 것보다 훨씬 심각합니다. 궁극적으로 GC는 남아있는 모든 항목을 처리합니다. 수동으로 처리하는 것은 좋은 관리 작업입니다. 그러나 부적절하게 처리하면 메모리 누수가 발생하고 예외가 발생하며 응용 프로그램에서 모든 종류의 비정상적인 결과가 발생할 수 있습니다. 결과적으로, 표준 권장 사항은 수행중인 작업과 수행중인 작업을 정확히 알고있는 경우에만 IDisposable을 구현해야한다는 것입니다. 확실하지 않은 경우 구현하지 마십시오.

+0

설명 주셔서 감사합니다 .. – derodevil