ユニットテスト可能な(Moqを使用した)抽象化を提供しようとする際に、抽象化の作成方法に応じてConcurrentQueue<T>
、フレームワークの実装を使用する利点が失われるかどうかについて議論しています。ConcurrentQueue<T>
次のコードリストでどちらか一方を実行することの意味は何ですか。
public abstract class MyMessageQueue1<T> : ConcurrentQueue<T>
{
public new virtual void Enqueue(T item)
{
base.Enqueue(item);
}
}
public class MyMessageQueue2<T>
{
private readonly ConcurrentQueue<T> _concurrentQueue =
new ConcurrentQueue<T>();
public virtual void Enqueue(T item)
{
_concurrentQueue.Enqueue(item);
}
}
最初の実装(MyMessageQueue1
)では、呼び出しを基本クラスに渡す前に、実装を提供するために基本クラスのメソッドを非表示にします。
2番目の実装では、内部をラップし、ConcurrentQueue<T>
必要に応じて呼び出しを渡します。
並行性を手動で処理する必要がありますかMyMessageQueue2
、またはすべての呼び出しがラップされたに渡されるため、問題ではありませんConcurrentQueue<T>
。