2011-09-27 4 views
2

.NET 2.0 웹 서비스에 대한 서비스 참조가 있습니다. 저장소에이 서비스에 대한 참조가 있으며 Ninject로 이동하려고합니다. 지금까지 DI를 사용해 왔지만 이와 같은 웹 서비스로 시도하지는 않았습니다.모든 통화에서 authheader가 필요한 웹 서비스를 어떻게 분리합니까?

그래서 저장소 생성자는 서비스의 클라이언트 프록시와 프록시의 모든 메서드의 첫 번째 매개 변수 인 AuthHeader 개체라는 두 개의 개체를 만듭니다.

AuthHeader는 마찰을 일으키는 곳입니다. 구체적인 유형은 프록시의 모든 호출에서 첫 번째 매개 변수로 필요하기 때문에 필자는 저장소의 AuthHeader에 의존해야한다고 생각합니다. 사실입니까?

내 reference.cs에서 AuthHeader 용 인터페이스를 추출했습니다. MakeSomeCall이 기대되기 때문에 때문에 ...

[Inject] 
public PackageRepository(IWebService service, IAuthHeader authHeader) 
{ 
    _service = service; 
    _authHeader = authHeader; 
} 

...하지만 나는

_service.MakeSomeCall(_authheader, "some value"). 

처럼 내 서비스 프록시로 전화를 걸 수없는 경우 : 나는 내 저장소 생성자에 대해 다음으로 이동하고 싶었다 IAuthHeader가 아닌 AuthHeader입니다.

여기 둥근 구멍을 사각형으로 고정합니까? 웹 서비스 "awesomeness"때문에 자연스럽게 맞지 않는 부분일까요? 접근 방식이 빠졌습니까?

답변

1

이 질문은 여기 정확히 이해하기 어렵지만, 몇 가지 일반적인 조언은이 상황에 관련이있을 수 :

  1. 의존성 주입은 모든 인터페이스이어야한다는 것을 의미하지 않습니다. 왜 WSDL에서 생성 된 웹 서비스 프록시로부터 인터페이스를 추출하려고하는지 확신 할 수 없다. WSDL의 유형은 사용자가 따라야하는 계약입니다. IAuthHeader에 아무런 동작이없는 경우 (바뀌지 않는 경우) 대체 구현을하지 않을 경우 특히 그렇습니다.

  2. 이 모든 이유가 보이는 이유는 이므로 잘못되었습니다. 이 웹 서비스는 잘못 설계되었습니다. 인증 토큰과 같은 모든 메시지에 공통적 인 정보는 본문으로 이동하면 안됩니다. 여기서 메서드 매개 변수로 변환됩니다. 대신 헤더으로 보내야하는데, 아이러니하게도 AuthHeader이라는 이름이 분명히 인 것은이 아닙니다. 클라이언트 또는 서비스 측에서 어떤 작업을 수행하기 전에 헤더를 프록시에서 가로 챌 수 있고 검사 할 수 있습니다. 행동의 일부인 WCF (일반적으로 인증을 위해서는 ClientCredentials)와 레거시 WSE에서는 확장으로 수행됩니다. 이론적으로 메시지 본문의 정보로이를 수행 할 수는 있지만 신뢰할 수있는 방법으로는 훨씬 더 어렵습니다. 어떤 경우

  3. 는 여기에서 정말 중요한 것은 너무 많은 저장소가 의존 무엇 하지만 그 의존성에서 오는 없습니다. AuthHeader이 커널에 의해 의존성으로 주입되면 여전히 DI의 모든 이점을 얻고 있습니다. 특히이 모든 것을 한 곳에서 등록하거나 다른 구현 (예 : 파생 클래스)을 대신 할 수있는 능력입니다.

디자인 문제는 제외하고 DI 구현에 실제 문제가 있다고 생각하지 않습니다. 수업에 AuthHeader을 가져 가야하는 경우 AuthHeader을 삽입하십시오. 해당 구문을 생성자 인수 또는 속성으로 사용하는 한 정확한 구문과 형식을 염두에 두지 마십시오.

+0

감사합니다. Aaronault. 이것은 분명히 나를 올바른 방향으로 움직일 것입니다. 내가 종속성을 잃어 버리려고하기 때문에 서비스 프록시를 포장하고 싶은 이유가 있습니다. AuthHeader가 방해가되지 않으면 랩/추출하지 않고도 거기에 완전히 도달 할 수 있습니다. 나는 모든 것을위한 인터페이스가 필요 없다는 것에 대해 당신이 말하는 것을 얻습니다. 나는 * IAuthHeader 인터페이스를 원한다. 난 그냥 서비스 프록시에 의존하지 않고 짧은 내 저장소를 구축하려고 해요. 나는 다른 접근법을 시도 할 것입니다. 도움을 주셔서 감사합니다. 건배. – MisterJames

관련 문제