Когда дело доходит до разницы в производительности между созданием объекта по методу или экземпляру класса, я бы не стал беспокоиться об этом. Однако то, что вы, кажется, пропустите здесь, - это некоторые важные принципы в отношении класса 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. Here - более интересная информация.
Как вы видите, я даже не говорил о том, какой из двух вариантов будет лучше для производительности, поскольку производительность не имеет значения, когда решение дает непоследовательные и неправильные результаты.
Я извиняюсь за мой длинный ответ :-)
Нет, это был довольно крутой ответ. Я желаю, чтобы каждый дал ответ длинный и описательный. – Tarik