2017-09-26 5 views
0

私は以下の構造を持っています。私が混乱しているのは、PhoneBaseを処分する方法です。 UnityがPhoneBaseを処分するかどうかはわかりません。ユニティで基本クラスを処理するベストプラクティスは

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パイプラインです。これは、2番目のバージョンが正しいことを意味し、ASP.NETパイプラインはコントローラ上で 'Dispose'を呼び出し、カスタムオブジェクトに対して' Dispose'を呼び出します。 –

答えて

2

IDisposableの目的を理解しているとは思いません。 がリソースを所有している場合、クラスはそれ自体が使い捨てのリソースを実装する場合にのみ、IDisposableを実装する必要があります。つまり、クラスは実際に新しいものを用意する必要があります。ではありません。クラスは注入されたリソースを決して処分すべきではありません。それはオブジェクトライフタイムマネージャーの仕事です - この場合のUnity。

PhoneBaseが実際に使い捨てリソースを所有していると仮定すると、MyPhoneはこのリソースとIDisposableの両方の実装を継承します。実際には、このシナリオでは実際にはPhoneBaseは存在しません。 MyPhoneは、PhoneBaseインスタンスへの内部参照を何らかの形で持っているようではありません。あなたが持っているのは、PhoneBaseと同じプロパティとメソッドを持つMyPhoneインスタンスとそれに特別に定義されたものだけです。

その後、あなたはIMyPhoneの代わりにMyPhoneを注入している場合、Unityは、そのオブジェクトを所有するエンティティがあり、そのためとして、その生涯の終わりに、それが何であろう(それを配置するための責任を負うものですあなたのDI設定で定義されています)。あなたのコントローラーはは絶対にを処分するべきではありません。期間。コントローラはそれを所有しておらず、Unityが他の場所に注入している場合、オブジェクトが不適切に処分されたため、他のインスタンスで例外が発生します。

副次的なことは、不適切に実装してIDisposableを使用するのは、必要なオブジェクトを処分しないことよりもはるかに悪いことです。最終的に、GCは残ったものを処理します。手作業で処理するのはちょうど良いハウスキーピングです。しかし、不適切に処理すると、メモリリークが発生したり、例外がスローされたり、アプリケーションにあらゆる種類の不快感を与えることがあります。結果として、あなたが何をしているのか、あなたが何をしているのかを知っている場合にのみ、IDisposableを実装すべきであるという標準的な勧告があります。わからない場合は実装しないでください。

+0

説明をありがとう.. – derodevil

関連する問題