2010-06-23 5 views
4

UPS 배송 웹 서비스를 사용하는 전자 상거래 앱을 개발 중입니다. 싱글 톤을 만드는 것이 좋다는 것을 알았으므로 언제든지 웹 서비스 인스턴스가 하나만 존재합니다. 내 코드는 아래와 같습니다.Webservices를 싱글 톤으로 사용하면 다른 사용자에게 문제가 발생할 수 있습니까?

Public Class Ship 
    Private Shared sync As New Object() 
    Private Shared _Service As New ShipService 

    Public Shared ReadOnly Property Service As ShipService 
     Get 
      If _Service Is Nothing Then 
       SyncLock sync 
        If _Service Is Nothing Then 
         _Service = New ShipService 
        End If 
       End SyncLock 
      End If 
      Return _Service 
     End Get 
    End Property 

    Public Shared Function GetInstance() As ShipService 
     Return Service() 
    End Function 
End Class 

다음은 사용 예정 스 니펫입니다.

Public Sub New(ByVal ToAddress As Address, ByVal WeightInLbs As String) 
    //Not relevant code 
    Ship.Service.UPSSecurityValue = Security 
    //More not relevant code 
End Sub 

Public Function ProcessShipment() As ShipmentResponse 
    Return Ship.Service.ProcessShipment(ShipmentRequest) 
End Function 

위의 생성자에서 위의 줄에서 서비스의 UPSSecurityValue를 설정해야합니다. 그런 다음 나중에 ProcessShipment 함수를 호출 할 것입니다. 내 질문은; 웹 서비스가 싱글 톤으로 거래되고 있기 때문에 앱의 다른 인스턴스가 동일한 UPSSecurityValue를 공유 할 수 있으며 설정 한 시점과 ProcessShipment를 호출 할 때 사이에 변경 될 수 있습니까?

답변

1

새로운 작업을 호출하고 보안 값을 설정할 때와 실제로 발송물을 처리 할 때 사이에 확실히 바뀔 수 있습니다. 싱글 톤은 응용 프로그램의 모든 사용자 (동일한 웹 응용 프로그램 내에서 공유됩니다. 즉, 서버에이 응용 프로그램의 사본이 여러 개있는 경우 각 사용자는 자신의 싱글 톤을 사용하므로 모든 사용자가 동일한 데이터를 공유합니다. .

User1       User2 
New (sets security code) 
           New (sets security code) 
ProcessShipment 
           ProcessShipment 

모두 출하량은 당신이 원하는하지 않습니다 사용자 2의 보안 코드로 처리합니다 : 여러 사용자가 동시에 응용 프로그램을 통해 실행하는 경우

(또는 사용자 2 뒤에 1ms 만입니다). 이를 안전하게 수행하는 방법은 패키지를 출하 할 때 보안 기능을 해당 기능에 전달한 다음 즉시 사용하는 것입니다. 나중에 사용하기 위해 저장하면 나중에 한 번의 명령으로 만 경주를 시작하게됩니다 사용자가 서로의 데이터를 읽는 조건.

관련 문제