Когда лучше всего использовать статические функции в ASP.NET?

Мне было интересно, когда использовать статические функции, а когда нет в ASP.NET?

Каковы преимущества и недостатки их использования в различных аспектах, таких как производительность, следование передовой практике и т. Д. (И многое другое, в зависимости от того, что вы считаете уместным).

3 ответа

Решение

Минусы:

  • проблемы с многопоточностью (статические функции не требуют вызова экземпляра, поэтому их легко вызывать из разных частей кода, и если они читают / записывают в общее состояние, это состояние может быть повреждено в многопоточной среде такие как ASP.NET)
  • сложный для модульного тестирования (поскольку статические функции не требуют экземпляра объекта, внедрение конструктора невозможно, то есть единственный способ внедрить зависимости - это передать их в качестве аргументов самой функции)

Плюсы:

  • производительность (это сомнительно - в большинстве случаев прирост производительности будет совершенно незначительным по сравнению с другими частями кода)

Определенно существуют ситуации, когда статическое является подходящим решением, как и в любом приложении. Каждый раз, когда у вас есть какой-то объект, который должен жить в области приложения, а не в области запроса, он должен быть статическим, и вы должны использовать статические методы для доступа и манипулирования им.

В качестве примера, вот фрагмент кода, который я недавно написал для приложения 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;
        }
    }
}

Единственный существенный недостаток статического метода - это то, что он почти полностью не тестируется на единицу. Пользователи метода должны привязываться к конкретному методу и не могут привязываться к абстракции, что затрудняет подделку или издевательство, если не невозможно.

Однако это может быть или не быть проблемой, в зависимости от кода.

Еще одна вещь, которую вы должны остерегаться, это то, что статические данные универсальны для всех запросов к серверу.

Другие вопросы по тегам