Получите DataContext объекта

Если бы функция была устаревшей, то это было бы где-то четко задокументировано.

Я вижу, вы пытаетесь получить https URL. Работает ли это, если вы пытаетесь получить http?

Вам нужно проделать еще немного работы, чтобы использовать LWP :: Simple с https. Это описано в README.SSL , который поставляется с дистрибутивом LWP. В настоящее время он говорит следующее:

Начиная с libwww-perl v6.02, вам нужно установить модуль LWP :: Protocol :: https из его отдельного дистрибутива, чтобы включить поддержку https: //. .. URL-адреса для LWP :: UserAgent.

Это позволяет этому распределению указывать требуемые зависимости как необязательные. См. https://rt.cpan.org/Ticket/Display.html?id=66838 для дальнейшего обсуждения, почему мы остановились на этом решении.

blockquote>

Таким образом, решение (почти наверняка) - установить LWP :: Protocol :: https .

9
задан Kevin Fairchild 14 November 2008 в 19:41
поделиться

3 ответа

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

Я написал следующий код (VB, я боюсь), который представляет свойство Context, которое может быть помещенным в объект данных, а затем использоваться для возврата DataContext (если есть), к которому прикреплен объект.

Private Const StandardChangeTrackerName As String = "System.Data.Linq.ChangeTracker+StandardChangeTracker"

Private _context As DataClasses1DataContext
Public Property Context() As DataClasses1DataContext
    Get
        Dim hasContext As Boolean = False
        Dim myType As Type = Me.GetType()
        Dim propertyChangingField As FieldInfo = myType.GetField("PropertyChangingEvent", BindingFlags.NonPublic Or BindingFlags.Instance)
        Dim propertyChangingDelegate As PropertyChangingEventHandler = propertyChangingField.GetValue(Me)
        Dim delegateType As Type = Nothing

        For Each thisDelegate In propertyChangingDelegate.GetInvocationList()
            delegateType = thisDelegate.Target.GetType()
            If delegateType.FullName.Equals(StandardChangeTrackerName) Then
                propertyChangingDelegate = thisDelegate
                hasContext = True
                Exit For
            End If
        Next

        If hasContext Then
            Dim targetField = propertyChangingDelegate.Target
            Dim servicesField As FieldInfo = targetField.GetType().GetField("services", BindingFlags.NonPublic Or BindingFlags.Instance)
            If servicesField IsNot Nothing Then

                Dim servicesObject = servicesField.GetValue(targetField)

                Dim contextField As FieldInfo = servicesObject.GetType.GetField("context", BindingFlags.NonPublic Or BindingFlags.Instance)

                _context = contextField.GetValue(servicesObject)

            End If
        End If

        Return _context
    End Get
    Set(ByVal value As DataClasses1DataContext)

        _context = value

    End Set

End Property

Вот версия C #:

public DataContext GetMyDataContext()
{
    // Find the StandardChangeTracker listening to property changes on this object.
    // If no StandardChangeTracker is listening, then this object is probably not
    // attached to a data context.
    var eventField = this.GetType().GetField("PropertyChangingEvent", BindingFlags.NonPublic | BindingFlags.Instance);
    var eventDelegate = eventField.GetValue(this) as Delegate;
    if (eventDelegate == null)
        return null;
    eventDelegate = eventDelegate.GetInvocationList().FirstOrDefault(
        del => del.Target.GetType().FullName == "System.Data.Linq.ChangeTracker+StandardChangeTracker");
    if (eventDelegate == null)
        return null;

    // Dig through the objects to get the underlying DataContext.
    // If the following fails, then there was most likely an internal change
    // to the LINQ-to-SQL framework classes.
    var targetField = eventDelegate.Target;
    var servicesField = targetField.GetType().GetField("services", BindingFlags.NonPublic | BindingFlags.Instance);
    var servicesObject = servicesField.GetValue(targetField);
    var contextField = servicesObject.GetType().GetField("context", BindingFlags.NonPublic | BindingFlags.Instance);
    return (DataContext)contextField.GetValue(servicesObject);
}

Обратите внимание, что объект может найти свой DataContext только в том случае, если в настоящее время он прикреплен к контексту с включенным отслеживанием изменений. Это свойство основано на том факте, что DataContext подписался на объект ' http://weblogs.asp.net/avnerk/archive/2007/03/29/reflecting-over-an-event.aspx http://www.bobpowell.net/eventsubscribers.htm

6
ответ дан 4 December 2019 в 20:25
поделиться

Часть забавы ПОСТЕПЕННО - то, что Вы не можете быть уверены, что объект знает, кто отслеживает его. Если объект имеет осведомленный о данных / лениво загружающиеся свойства, то Вы смогли прослеживать контекст через отражение, но в действительности это будет путаницей. Это был бы намного инструмент для очистки для простой передачи контекста данных коду, для которого нужен он.

3
ответ дан 4 December 2019 в 20:25
поделиться

Самая простая вещь сделать состоит в том, чтобы передать DataContext в Ваш метод.

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

2
ответ дан 4 December 2019 в 20:25
поделиться
Другие вопросы по тегам:

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