2017-12-15 1 views
3

웹 응용 프로그램이 여러 모듈로 작성되어 있습니다. 하나는 모든 데이터베이스 관련 사항을 다루고, 하나는 보고서를 처리하고, 하나는 모든 웹 서비스로 구성되며, 하나는 비즈니스 용으로 구성됩니다. 논리 및 데이터 무결성 검증 및 기타 여러 가지가 있습니다. 그래서, 나는 여러 가지 방법을 가지고, 기능이 모듈에 의해 다루어졌습니다.웹 서비스 API에서 컨텍스트로 여러 키 값을 추가하십시오.

이제는 웹 서비스에서 세션을 사용하고 일부 API에서 트랜잭션을 사용해야합니다. 첫 번째 접근법은 세션, 트랜잭션 (* sql.Tx)을 지원하는 기존 메소드의 서명을 변경하는 것입니다 (이는 어려운 작업이지만 어쨌든해야합니다!). 이제 저는 실제로 이러한 모든 메소드를 통과해야하는 무언가가 미래에 올 경우 어떻게 될까요? 그런 다음 메소드 서명을 다시 변경하려면이주기를 다시 통과해야합니까? 이것은 좋은 접근 방법이 아닌 것 같습니다.

나중에 context.Context는 모든 메소드 호출에 대해 메소드 호출의 첫 번째 인수 장소에 컨텍스트 매개 변수를 전달하는 좋은 접근 방법 일 수 있음을 발견했습니다. 따라서 메서드 서명을 한 번만 변경해야합니다. 이 접근법을 사용하면 아무도 그 컨텍스트 개체에 여러 개의 키 (세션, sql.Tx)를 설정/전달할 수있는 방법을 말해 줄 수 있습니까? (AFAIK, context.Context는 WithValue 메서드를 제공하지만 여러 키에 사용할 수 있습니까?) 중첩 함수 호출에서 키를 설정하는 방법도 가능합니까?

실제로이 질문에는 두 가지 질문이 있습니다.

  1. 내 솔루션으로 context.Context을 고려해야합니까? 그렇지 않다면, 나에게 다른 접근법에 대한 빛을주십시오.
  2. context.Context에 여러 개의 키와 값을 설정하려면 어떻게해야합니까?
+1

여러 값을 설정하여 여러 값을 설정합니다. 그렇게 할 때 겪었던 문제점을 보여줄 수 있습니까? 하나의 구조체에 모든 데이터를 포함하는 단일 값을 설정할 수도 있습니다. – JimB

+0

다시 말하지만, 필자가 보았 듯이 프로그래머는 'ip'또는 'userkey'와 같은 값으로 컨텍스트를 반환합니다. 컨텍스트에서 세션 객체뿐만 아니라 sql.Tx를 사용하려는 경우 중첩 된 함수가 컨텍스트에서 해당 정보를 추출하여 사용할 수 있도록 어떻게 구현합니까? – rsudip90

+3

관련 질문 [Context 인터페이스 디자인] (https://stackoverflow.com/questions/40654605/design-of-context-interface/40659449#40659449); 가능한 중복 (Golang context.WithValue : 여러 키 - 값 쌍을 추가하는 방법) (https://stackoverflow.com/questions/40379960/golang-context-withvalue-how-to-add-several-key-value-pairs). – icza

답변

0

마지막으로 나는 Go context experience reports에서 기사를 연구 한 후 컨텍스트 패키지 솔루션을 사용하기로 결정했습니다. 그리고 특히 나는 Dave Cheney's article이 도움이된다는 것을 알았습니다.

음, 문맥에 맞는 맞춤 솔루션을 gorilla (Ah, 다소!)으로 만들 수 있습니다. 그러나 Go가 이미이 문제에 대한 해결책을 가지고 있기 때문에 컨텍스트 패키지로 갈 것입니다.

지금 당장은 트랜잭션이 시작되면 사용자 인증과 권한 부여를 지원하기 위해 각 메소드에서 세션 및 데이터베이스 트랜잭션 만 필요합니다.

오버 헤드가 발생할 수 있습니다. 응용 프로그램의 각 방법마다 context.Context이 필요하므로 지금은 취소, 마감, 시간 제한 기능이 필요하지 않지만 나중에 도움이 될 수 있습니다.

관련 문제