Общие методы в сеансах ASP.NET - PullRequest
2 голосов
/ 25 февраля 2011

В продолжение предыдущего вопроса я задал «Архитектура ASP.Net, специфичная для общих / статических функций»

Я все еще пытаюсь понять последствия использования общих методов в ASP.NET.

Так, например, давайте возьмем следующий код.

    Public Shared Function GetCategoryByID(ByVal CategoryID As Guid) As Category
        If Not CategoryID.Equals(Guid.Empty) Then
            Dim res As New Category

            Using sqlConn As New SqlConnection(My.Settings.ConnectionString)
                sqlConn.Open()

                Using dr As IDataReader = CategoryDataLayer.GetCategoryByIDQuery(sqlConn, CategoryID)
                    Return CType(BaseDataLayer.FillObject(res, dr), Category)
                End Using
            End Using

        Else
            Return Nothing
        End If
    End Function

Теперь я представляю, как клиент 1 подключил и запустил этот метод GetCategoryByID () из своего сеанса с guid {A20E625F-2333-4742-BFD9-05BE7649222D}.

Давайте теперь скажем, что, например, процесс собирается выполнить следующую строку.

Using dr As IDataReader = CategoryDataLayer.GetCategoryByIDQuery(sqlConn, CategoryID)

В этот момент клиент 2 запускает тот же общий метод, но с guid {6D806B82-FC7F-4124-AFB9-45E2689BC9F5}.

В этот момент CategoryID не становится {6D806B82-FC7F-4124-AFB9-45E2689BC9F5} и, следовательно, мешает клиенту 1, поскольку теперь CategoryID изменился, учитывая, что это общий метод?

Может кто-нибудь уточнить, пожалуйста?

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

Ответы [ 3 ]

2 голосов
/ 25 февраля 2011

Несмотря на то, что один и тот же метод выполняется, он запускается в двух разных контекстах. Любые переменные, локальные для этого метода (включая параметр CategoryId), не являются общими.

2 голосов
/ 25 февраля 2011

В вашем примере кода переменная res является локальной переменной общего метода. Никто, даже другой общий метод не может коснуться этой переменной. Он будет существовать в течение всего срока действия метода, а затем исчезнет. CategoryId точно такой же, это локальная переменная, к которой нельзя прикоснуться извне.

VB имеет другую концепцию под названием Static, которая сильно отличается от статической версии C #, что может вызвать некоторую путаницу.

2 голосов
/ 25 февраля 2011

Единственная проблема с Shared методами - общая состояние .

Если вы используете поле Shared или переменную Static, оно будет разделено между запросами и вызовет проблемы.

Однако метод Shared, который не использует внешнее состояние или общие объекты, будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...