LinqToSql объявляют и инстанцируют лучшей практики DataContext?

В App Engine Standard при использовании среды выполнения Python3.7 тег script под обработчиками должен быть установлен на auto. Вы можете проверить документацию по этому здесь о том, как должен быть сконфигурирован app.yaml, обратите внимание, что он отличается от среды выполнения Python2.7, где вам нужно было указать script для запуска. [1116 ]

Вы можете решить эту проблему, изменив файл app.yaml, например, так:

runtime: python37

entrypoint: gunicorn -b :$PORT handle_incoming_email.app

env_variables:
...

inbound_services:
- mail
- mail_bounce

handlers:
- url: /static
  static_dir: static

- url: /_ah/mail/
  script: auto
  login: admin

Обратите внимание, как требуется изменить script в /_ah/mail/ на auto вместо указав путь к скрипту для запуска. Затем обработчик должен автоматически найти сценарий для выполнения из файлов, развернутых в App Engine.

Далее, в своем файле handle_incoming_email.py вы не определяете какую-либо точку входа для обработки вашего URL /_ah/mail, вы можете решить эту проблему, добавив следующее, например:

import webapp2

app = webapp2.WSGIApplication([
    ('/_ah/mail/', IncomingMailHandler),
], debug=True)

Уведомление Теперь, как я изменил entrypoint в вашем файле app.yaml, чтобы он соответствовал вновь созданной точке входа WSGI в вашем файле handle_incoming_email.py.

Также я не уверен насчет регулярного выражения '/.+' для обработчика, вы должны оставить его в '/.*' .

15
задан Keith Hoffman 12 January 2012 в 18:34
поделиться

5 ответов

Во-первых, удостоверьтесь, что Вы располагаете свой DataContext, когда Вы сделаны! Он может быть тяжелым маленьким ублюдком (отредактируйте не тяжелый для инстанцирования, но тяжелый, чтобы иметь в наличии, если Вы продолжаете использовать его, не располагая); Вы не хотите старый DataContexts, бродящий вокруг в памяти.

Во-вторых, DataContext предназначается для представления единственной логической транзакции. Например, необходимо создать новый каждый раз, когда Вы хотите запустить новую транзакцию и избавиться от него, когда та транзакция является завершенной. Таким образом в Ваших целях, который является, вероятно, объемом GetUser метод. Если у Вас есть серия вызовов DB, которые должны быть выполнены как группа, они должны все использовать тот же DC прежде, чем избавиться от нее.

14
ответ дан 1 December 2019 в 02:47
поделиться

Как Король сказал M, datacontext предназначается, чтобы инстанцироваться, использоваться и располагаться для каждой логической транзакции. Шаблоны как это иногда называют "единицей работы".

Наиболее распространенный способ (что я знаю о), чтобы сделать это должно инстанцировать Вашего datacontext в блоке использования. Я не использовал VB в некоторое время, но он должен выглядеть примерно так:

Using dc As New MyDataContext()
   user = (From u in dc.Users Where u.ID = UserID).Single()
End Using

Это не только укрепляет вид транзакции/единицы работы (через физическую форму кода), но это гарантирует, чтобы вызов Расположил () на Вашем datacontext когда концы блока.

Посмотрите эту страницу MSDN:

В целом экземпляр DataContext разработан для длительности одну "единицу работы" однако приложение определяет тот термин. DataContext является легким и не является дорогим для создания. Типичный LINQ к приложению SQL создает экземпляры DataContext в объеме метода или как член недолгих классов, которые представляют логический набор связанных операций базы данных.

12
ответ дан 1 December 2019 в 02:47
поделиться

Я думаю, возможно, что настоящая проблема - это User вероятно, не правильное место для вызова члена экземпляра GetUser.

0
ответ дан 1 December 2019 в 02:47
поделиться

Существует несколько различных путей, которыми Вы могли пойти об этом, которое будет хорошей практикой, я думаю. Сначала Вы могли использовать шаблон Репозитория, где Вы запрашиваете Репозиторий для объекта, он выходит в базу данных, получает объект - возможно, отсоединение его от контекста данных или имения в наличии контекста данных в зависимости от реализации Репозитория - и возвращает его Вам. Методы фабрики для Ваших объектов были бы на Репозитории, не самих объектах. Вы, вероятно, использовали бы отражение и дженерики для уменьшения количества методов, необходимо реализовать и сохранить код DRY.

Другой путь и способ, которым LINQtoSQL был предназначен, чтобы использоваться исходно, по моему скромному мнению, состоят в том, чтобы создать контекст данных для каждого набора операций базы данных, которые Вы намереваетесь выполнить. В этом создание контекста данных происходит вне объекта также, обычно в классе, который использует объекты, не в слое данных вообще. Вы могли также добавить, что методы к контексту данных - делают Ваш фактический краткий обзор контекста данных и наследовались ему - использование отражения снова, для выполнения некоторых общих функций извлечения так, чтобы Вы не повторяли их. Необходимо было бы, вероятно, использовать шаблон базы данных как ActiveRecords, где идентификационные столбцы всегда имеют то же имя для создания этой работы.

С другой стороны, Вы могли посмотреть на использование nHibernate или ActiveRecord Замка вместо того, чтобы копировать любое из вышеупомянутого в Вашем собственном решении.

0
ответ дан 1 December 2019 в 02:47
поделиться

Может быть легче, если Вы оставляете Пользовательский класс в покое и позволяете дескриптор IDE, это - создание.

Часто я предпочитаю иметь отдельный дескриптор класса поиск данных. Скажем, Вы называете это, UserDataProvider и все вызовы для получения Пользовательского экземпляра в конечном счете проходят этот класс.

Конструктор UserDataProvider мог инстанцировать глобального экземпляра объекта контекста данных для повторного использования. Это выглядело бы примерно так (в C# и непротестированном коде, так терпите меня):

public class UserDataProvider 
{
    private UserDataContext _data = null;

    public UserDataProvider()
    {
        _data = new UserDataContext();
    }

    public User GetUser(int userID)
    {
        return _data.Users.FirstOrDefault(u => u.UserID == userID);
    }
}

С другой стороны, Вы могли бы поместить инициализацию в свойство и доступ что свойство для использования контекста данных.

public class UserDataProvider 
{
    private UserDataContext _dataContext;

    private UserDataContext DataContext 
    {
        get
        {
            if (_data == null)
                _data = new UserDataContext();

            return _data;
        }
    }

    public User GetUser(int userID)
    {
        return DataContext.Users.FirstOrDefault(u => u.UserID == userID);
    }
}
0
ответ дан 1 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: