EF를 사용해 데이터베이스를 조작하고, 동일한 HTTP 요청에서 DbContext(데이터베이스 연산 컨텍스트 클래스)를 추출하여 고유성을 보장하고, 두 가지 방식을 사용해 Entity Framework 컨텍스트의 고유성을 보장하며, .NET Core 플랫폼의 솔루션이 첨부됩니다.
옵션 1
객체가 전역적으로 고유하다는 보장이 있다면, 분명히 고전적인 디자인 패턴인 싱글톤 모드를 떠올릴 것입니다. 사용할 객체가 스레드 내에서 고유해야 한다면?
데이터 슬롯: CallContext, msdn의 callcontent에 대한 설명을 참고하세요.
CallContext는 메서드 호출을 위한 스레드 로컬 저장소와 유사한 전용 컬렉션 객체로, 각 논리 실행 스레드마다 고유한 데이터 슬롯을 제공합니다. 데이터 슬롯은 다른 논리 스레드의 호출 컨텍스트 간에 공유되지 않습니다. 객체는 실행 코드의 경로를 따라 전파되고 해당 경로의 개별 객체들이 검사할 때 CallContext에 추가할 수 있습니다.
즉, 현재 스레드는 객체를 스레드의 로컬 저장소에 저장하고, 스레드가 파괴될 때 객체도 파괴됩니다.
코드 사용:
사용 시나리오: 개인적으로는 객체가 스레드 내에서 전역적으로 사용되어야 할 때 사용되며, 다른 스레드 패키지 확장 스레드가 접근할 수 없을 때 사용됩니다. 예를 들어, EF의 데이터 컨텍스트에서는 각 요청마다 스레드가 생성되고, 이 시점에서 서로 다른 함수를 사용할 데이터 컨텍스트 객체가 생성되어 트랜잭션 문제를 피하기 위해 함께 커밋됩니다. 물론 어떤 사람들은 변수를 만들 수 있냐고 물을 수도 있는데, 이 객체도 같은 목적을 달성할 수 있지만, 이 객체는 다른 스레드 데이터와도 상호작용할 수 있어서 스레드 내에서 고유하다는 개념에 반합니다.
옵션 2
이 시나리오는 웹 HTTP 요청을 기반으로 하며, 모든 요청이 새로운 스레드이고 코드는 다음과 같습니다:
.NET 코어에서 "CallContext" 사용
CallContext는 더 이상 사용할 수 없다는 것을 알고 있습니다. NETStandard 또는 .NET Core를 사용하세요.
하지만 Asynclocal을 사용<T>해 CallContext를 모방할 수 있습니다. 다음 정적 클래스를 생성하면 됩니다:
참조가 필요한 네임스페이스:
또한 사용하기 쉽습니다(여기서는 Common 라이브러리에 CallContext를 넣었습니다):
|