IDisposable インスタンスの注入を可能にするかなり標準的な抽象クラスがある場合。ただし、このクラスから継承する一部のクラスは、他のクラスと同様に、注入されたリポジトリを破棄してはなりません。明らかな解決策は、コンストラクターを持つことです。
public abstract class WorkspaceViewModel : IDisposable
{
readonly bool _cascadeDisposeRepository;
protected WorkspaceViewModel(IRepository repository, bool cascadeDisposeRepository=true)
{
_repository = repository;
_cascadeDisposeRepository = cascadeDisposeRepository;
}
編集:
私もコンストラクタを持っていました
protected WorkspaceViewModel()
:this(new RepositoryA(), true){}
編集を終了
次に、マイクロソフトが推奨する方法で Dispose メソッドを実装します。
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_cascadeDisposeRepository) { _repository.Dispose(); }
.....
しかし、私は IDisposable がこのように実装されているのを見たことがなく、それが悪い習慣であるかどうか疑問に思っていました (もしそうなら、なぜ、そして他の解決策が望ましいでしょうか)。
ご感想ありがとうございます。
編集: マークのコメントにより、WorkspaceViewModel から継承するすべてのクラスに、WorkspaceViewModel の実装されたインターフェイスから IDisposable を削除しながら、独自のインスタンスを作成して破棄する (そして IDisposable を実装することを選択する) ことを強制する、パラメーターのないコンストラクターを使用しないことが望ましい実装である可能性があることに気付きました。