0

웹 API를 단일 IOC로 사용하고 있습니다.웹 API 2 - 유니티 IOC - 요청 별 공유 인스턴스 변수

웹 API 클라이언트는 요청 헤더에 client-id를 전달하고이 값에 따라 외부 DLL의 메소드 인스턴스를 생성하기 위해 의존성을 해결합니다.

이 인스턴스를 생성하는 데 약 6-7 초가 소요되므로 웹 API에서 성능 문제가 발생합니다.

내가 원하는 것은 헤더의 동일한 클라이언트 ID를 가진 호출에 대한 인스턴스 생성을 방지하는 것입니다.

이것은 내가 지금까지 구현 한 방법입니다 -

//========================== ArchiveFactory ========================== 
     ArchiveFactory archiverFactory = (HttpRequest httpRequest) => 
     { 
      container.RegisterType<IArchive, Archive>("Archive", 
      new HierarchicalLifetimeManager(), 
      new InjectionConstructor(
       new ResolvedParameter<IStoreClient>(), 
       Helper.GetArchiveContext(httpRequest)) 
       ); 
      return container.Resolve<IArchive>("Archive"); 
     }; 
     container.RegisterInstance(archiverFactory); 

내 요구 사항에 구체적으로 - 나는 이미지를 검색 할 아마존 서비스를 호출하고 있고 아마존을 호출하는 기업 DLL이있다.

+0

그냥 더 추가하려면 - 나는 인스턴스의 정적 컬렉션을 가지고 있다고 생각했습니다. 나중에 인스턴스가 특정 요청에 대해 사용할 수 없는지 확인할 수 있습니다. 그런 다음에 만 새 인스턴스를 만듭니다. – Aman

+1

안녕하세요 컨테이너. 은 6-7 초 걸립니까? 인스턴스를 만드는 데 가장 많은 시간을 할애 할 수 있습니까? – Spock

+0

T의 생성자는 다른 서비스와 세션을 설정해야합니다. 그 이유는 T를 한 번만 구성하고 더 이상 같은 요청에 사용하는 이유입니다. – Aman

답변

0

컨트롤러/API 레이어 (예 : Strathweb.CacheOutput.WebApi2)에서 캐싱 메커니즘을 사용할 수 있으며 아래에서 이와 같은 컨트롤러 메소드를 꾸밀 수 있습니다. 매개 변수를 기반으로 캐시 할 수 있으므로 요청이 동일한 매개 변수로 제공되면 캐시의 결과가 반환됩니다.

[HttpGet] 
[Route("")] 
[CacheOutput(ServerTimeSpan = 60, ExcludeQueryStringFromCacheKey = true)] 
public IHttpActionResult GetProducts(string clientId) 
{ 
    var product = new List<Product>(); 
    return Ok(product); 
} 
0

당신은 컨트롤러/API 층 (예를 들어, Strathweb.CacheOutput.WebApi2)에서 캐싱 메커니즘을 사용할 수 있으며 다음과 같은 컨트롤러 방법을 장식하실 수 있습니다. 매개 변수를 기반으로 캐시 할 수 있으므로 요청이 동일한 매개 변수로 제공되면 캐시의 결과가 반환됩니다.

[HttpGet] 
[Route("")] 
[CacheOutput(ServerTimeSpan = 60, ExcludeQueryStringFromCacheKey = true)] 
public IHttpActionResult GetProducts(string clientId) 
{ 
    var product = new List<Product>(); 
    return Ok(product); 
} 

또한 클래스 생성자에서 인스턴스 생성을 시도하는 것이 너무 느린 문제가 있는지 확인할 수 있습니다. 적용하려면 지연로드를 고려하는 것이 좋습니다.

관련 문제