Определенно существуют ситуации, когда статическое является подходящим решением, как и в любом приложении. Каждый раз, когда у вас есть какой-то объект, который должен жить в области приложения, а не в области запроса, он должен быть статическим, и вы должны использовать статические методы для доступа к нему и манипулирования им.
В качестве примера приведу фрагмент кода, который я недавно написал для приложения ASP.NET, которое по сути является кешем сериализатора. Сериализаторы дороги в создании, и мы можем повторно использовать один и тот же тип для каждого типа в течение всего срока службы нашего приложения, поэтому нет необходимости тратить время в каждом потоке запросов на них:
( Примечание: это было урезано, чтобы продемонстрировать статические аспекты)
public class XmlSerializerUtility
{
private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();
private static object sync = new object();
public static T Deserialize<T>(string input)
{
XmlSerializer xs = GetSerializer(typeof(T));
using (StringReader sr = new StringReader(input))
{
return (T)xs.Deserialize(sr);
}
}
public static XmlDocument Serialize(object input)
{
XmlDocument doc = new XmlDocument();
XmlSerializer xs = GetSerializer(input.GetType());
using (MemoryStream stream = new MemoryStream())
{
xs.Serialize(stream, input);
stream.Position = 0;
doc.Load(stream);
}
return doc;
}
private static XmlSerializer GetSerializer(Type type)
{
lock (sync)
{
XmlSerializer xs = null;
if (!serializers.ContainsKey(type))
{
xs = new XmlSerializer(type);
serializers.Add(type, xs);
}
else
{
xs = serializers[type];
}
return xs;
}
}
}