I have a singleton that uses the ‘static readonly T Instance = new T();’ pattern. However, I ran into a case where T is disposable, and actually needs to be disposed for unit tests. How can I modify this pattern to support a disposable singleton?
The interface I would like is something like:
var x = Foo.Instance; var y = Foo.Instance; // x == y ... x.Release(); // this causes the next Foo.Instance to return a fresh object // also, it assumes no further operations on x/y will be performed.
Note – the pattern has to be thread-safe, of course.
Edit – for the purpose of production code, this is a true singleton. The thing is that it locks some files, and so for cleanup in unit tests we have to dispose it.
I would also prefer a pattern that can be reused, if possible.
Mark
Releaseasinternaland use theInternalsVisibleToattribute to expose it only to your unit testing assembly. You can either do that, or if you’re wary someone in your own assembly will call it, you can mark it asprivateand access it using reflection.Use a finalizer in your singleton that calls the
Disposemethod on the singleton instance.In production code, only the unloading of an
AppDomainwill cause the disposal of the singleton. In the testing code, you can initiate a call toReleaseyourself.