종속성 주입을 위해 StructureMap과 함께 여러 데이터베이스 조각을 사용하는 API 응용 프로그램이 있습니다. 각 API 호출에서 필요한 헤더 중 하나는 ShardKey
이며이 호출이 어떤 호출을 처리하는지 알려줍니다.StructureMap의 크로스 스레드 충돌
var nestedContainer = container.GetNestedContainer();
using (var db = MyDbContext.ForShard(shardKey)) // creates a new MyDbContext with connection string appropriate to shardKey
{
nestedContainer.Configure(cfg => cfg.For<MyDbContext>().Use(db));
await Next.Invoke(context);
}
이 내 테스트 환경에서 아름답게 작동 및 통합 테스트의 배터리를 전달합니다이를 적용하기 위해, 나는 (명확성을 위해 냈다) 다음 코드를 포함 ShardingMiddleware
라는 OwinMiddleware
클래스를 가지고있다.
그러나 통합 테스트는 효과적으로 단일 스레드입니다. 이를 실제 API가 여러 개의 동시 호출로 치고있는 QA 환경에이를 배치하면 배 모양이 시작됩니다. Ferinstance :
System.ObjectDisposedException : 폐기 된 개체에 액세스 할 수 없습니다. 이 오류의 일반적인 원인은 종속성 주입으로 해결 된 컨텍스트를 삭제 한 다음 나중에 응용 프로그램의 다른 위치에서 동일한 컨텍스트 인스턴스를 사용하려고하는 것입니다. 컨텍스트에서 Dispose()를 호출하거나 using 문에서 컨텍스트를 래핑하는 중일 수 있습니다. 의존성 주입을 사용하는 경우, 의존성 주입 컨테이너가 문맥 인스턴스를 처리하도록해야합니다.
또는 StructMap에 유효한 MyDbContext
의 유효한 인스턴스가 없다는 것을 나타내는 다른 예외.
여러 스레드가 어떻게 든 서로의 구성을 어지럽히는 것 같지만 나에게있어 중첩 된 컨테이너를 사용하여 각 API에 대한 데이터베이스 컨텍스트를 저장하는 방법을 이해하는 방법은 이해할 수 없습니다. 요구.
어떤 아이디어가 잘못되었을 수 있습니까?
업데이트 : 또한 인터페이스에 내 Db 컨텍스트를 추상화하려고 시도했습니다. 진정한 차이는 없었습니다. 오류가 계속 발생합니다.
'System.InvalidOperationException :'SomeController '형식의 컨트롤러를 만들려고 할 때 오류가 발생했습니다. 컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오. ---> StructureMap.StructureMapConfigurationException : 없음 기본 인스턴스가 등록되지 않고 자동으로 'MyNamespace.IMyDbContext'
업데이트 2 유형 결정되지 않을 수 있습니다 내가 문제를 해결하지만, 현상금은 여전히 열려 있습니다. 내 대답은 아래를 참조하십시오.
당신의'DbContext'는 [Captive Dependency] (http://blog.ploeh.dk/2014/06/02/captive-dependency/)로 살아있을 수 있습니다. 이 의존성의 소비자가'DbContext'보다 수명이 길지 않거나 직접적으로 소비자에게 DbContext를 주입하는 것을 더 잘 방지해야합니다. 'DbContext'는 런타임 데이터이고 런타임 데이터는 구성 요소에 주입되어서는 안됩니다 (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99). 대신 추상화 뒤에서 DbContext를 숨 깁니다. – Steven