Disposable singleton in C#

.net, c#, dispose, singleton

Solution

Mark `Release` as `internal` and use the `InternalsVisibleTo` attribute 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 as `private` and access it using reflection.

Use a finalizer in your singleton that calls the `Dispose` method on the singleton instance.

In production code, only the unloading of an `AppDomain` will cause the disposal of the singleton. In the testing code, you can initiate a call to `Release` yourself.

Problem

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.

Original source