私はIDisposableを実装するサードパーティのオブジェクトを使っています。ユニットテストを "有能"にするために、私はラッパーを作ります。私はオブジェクトがIDisposableを実装していることを理解しています。私のラッパーはIDisposableも実装する必要があります。IDisposableの実装と使用
public interface IWrapper : IDisposable
{
void Complete();
}
public class Wrapper : IWrapper
{
private readonly ThirdPartyLib lib;
public Wrapper()
{
lib = new ThirdPartyLib();
}
public void Complete()
{
lib.Comlete();
}
public void Dispose()
{
lib.Dispose();
}
}
public class Processor : IProcessor
{
private readonly IWrapper wrapper;
public Processor(IWrapper wrapper)
{
this.wrapper = wrapper;
}
public void Process()
{
// do some work
using (wrapper) {
// do more work
}
}
}
と仮定プロセッサはそれとプロセスを使用しているいくつかのクラスに注入された()、我々は再びプロセスを()を呼び出す場合はラッパーにhappends何
- を実行していますか? - ThirdPartyLib()はラッパーコンストラクターで一度だけ作成されたため、例外をスローしませんでした。
- 参照がある限り、処分されませんか?
- ラッパーは多分(開始と言う、新しい()ThirdPartyLibの「INGのが」ないコンストラクタではなく、別々の方法で実行するように構築する必要があります) - そのような:
public class Wrapper : IWrapper { private ThirdPartyLib lib; public void Begin() { lib = new ThirdPartyLib(); } public void Complete() { lib.Comlete(); } public void Dispose() { lib.Dispose(); } }
そして、それを使用して:
using (wrapper.Begin()) {
私はこれについて大きなイメージを持っていないと感じます。なぜ 'Processor'はコンストラクタに注入された' Wrapper'を処理するのですか?通常、私はあなたが 'Processor'が' Process(IWrapper wrapper) 'のようなメソッド呼び出しを持っていて、あなたがそのラッパーを処理できるようにすると期待していますが、呼び出し側が呼び出す必要があるそれを効果的に所有しているので、 'IWrapper'に' Dispose 'します。これが当てはまらない場合、私はおそらく 'IDisposable'を' IProcessor'に実装して、 'IWrapper'を処分するときだけ処分します。 –
IProcessorにIDisposableを実装すると、(現在の設計で)IProcessorが処分されたときにWrapperを処分するだけで、usingステートメントのヒットにヒットしない場合は除きますか?これは、(親)IPプロセッサがIWrapperへの参照を保持しているからです - 私たちは "}"に処分するように言いました。 – BobSwanson
それで、DIで初期化されたオブジェクトは、ほとんどの場合、他のオブジェクトによって使用されるシングルトンであるか、少なくとも他の何かがライフタイムを制御しています。 DIに依存するオブジェクトはオブジェクトを単に使用するだけで、オブジェクトを作成したものが何であっても後でそれをヌークする責任があります。 DIは〜のようです_ "ちょっとオブジェクトがほしい、他の誰かが私のためにそれを作成して削除することができます" _ – MickyD