Когда речь идет о разнице в производительности между созданием объекта для метода или экземпляра класса, я бы не стал сильно беспокоиться об этом. Однако то, что вы, похоже, здесь упускаете, - это несколько важных принципов, касающихся класса DataContext и шаблона единицы работы в целом.
Класс DataContext работает как единая единица работы. Таким образом, вы создаете DataContext, вы создаете объекты, обновляете и удаляете объекты, вы отправляете все изменения и после этого удаляете DataContext. Вы можете создать несколько классов DataContext для одного запроса, по одному на (бизнес) транзакцию. Но в ASP.NET вы никогда не должны создавать DataContext, который выдерживает веб-запрос. Все DataContexts, созданные во время запроса, должны быть удалены, когда или до того, как этот запрос закончен. Для этого есть две причины.
Прежде всего, DataContext имеет внутренний кеш всех объектов, которые он извлек из базы данных. Использование DataContext в течение длительного периода времени приведет к бесконечному росту его кэша и может вызвать проблемы с памятью, когда у вас большая база данных. DataContext также предпочтет возвращать объект из кэша, когда это возможно, и ваши объекты быстро устаревают. Любая операция обновления и удаления, выполненная в другом DataContext или непосредственно в базе данных, может остаться незамеченной из-за этой устаревания.
Вторая причина отсутствия кэширования DataContexts заключается в том, что они не являются поточно-ориентированными. Лучше всего рассматривать DataContext как единицу работы или как (бизнес) транзакцию. Вы создаете кучу новых объектов, добавляете их в DataContext, изменяете некоторые другие, удаляете некоторые объекты, и когда вы закончите, вы вызываете SubmitChanges. Если другой запрос вызывает SubmitChanges для этого же экземпляра во время этой операции, вы теряете идею транзакции. Когда вы позволяете коду делать это, в наиболее удачной ситуации ваши новые объекты сохраняются, а ваша транзакция разделяется на две отдельные транзакции. В худшем случае вы оставляете свой DataContext или объекты, которые он сохраняет, в недопустимом состоянии, что может означать сбой других запросов или попадание недопустимых данных в вашу базу данных. И это не маловероятный сценарий, я видел странные вещи, происходящие с проектами, когда разработчики создавали один (статический) DataContext для каждого веб-сайта.
Итак, помня об этом, давайте вернемся к вашему вопросу. Хотя определение DataContext в качестве поля экземпляра не является проблемой, важно знать, как вы используете класс DataLayer
. Когда вы создаете один DataLayer
для запроса или для каждого вызова метода, вы, вероятно, будете в безопасности, но в этом случае вы не должны хранить этот DataLayer
в статическом поле. Если вы хотите сделать это, вы должны создать DataContext для каждого вызова метода.
Важно знать, как устроен класс DataLayer
. В своем коде вы показываете только метод запроса. Нет CUD методов. Каждый метод должен быть отдельной транзакцией, или вы хотите вызвать несколько методов и впоследствии вызвать SaveChanges для DataLayer
? Когда вы хотите эту последнюю опцию, вам нужно сохранить DataContext
как поле экземпляра, и в этом случае вы должны реализовать IDisposable
на DataLayer
. Когда каждый метод является своей собственной транзакцией, вы можете создать DataContext для каждого метода, и вам следует заключить DataContext в оператор using. Однако обратите внимание, что удаление DataContext может вызвать проблемы, когда вы возвращаете объекты с отложенной загрузкой свойств из метода. Эти свойства больше не могут быть загружены при удалении DataContext. Здесь более интересная информация об этом.
Как видите, я даже не говорил о том, какой из двух ваших вариантов будет лучше для производительности, потому что производительность не имеет значения, когда решение дает противоречивые и неправильные результаты.
Извините за длинный ответ: -)