1

내 의존성 삽입을 위해 Unity와 함께 WCF에서 UserNamePasswordValidator를 사용하지만 WCF가 UserNamePasswordValidator의 인스턴스를 생성하기 때문에 클래스에 컨테이너를 삽입 할 수 없습니다. 그러면 어떻게 이런 일이 생길까요?WCF의 사용자 정의 UserNamePasswordValidator에 종속성을 주입하는 방법은 무엇입니까?

내가 생각할 수있는 가장 간단한 해결책은 모든 동일한 메소드를 노출하는 UnityContainer의 정적 인스턴스 주위에 정적 프록시/래퍼 클래스를 만드는 것입니다.이 방법은 모든 클래스가 컨테이너에 액세스 할 수 있으며, 어디 에나 주입 할 필요가 없습니다.

그래서 코드에서 UnityContainerWrapper.Resolve()를 할 수 있습니다. 그래서 기본적으로이 솔루션은 저에게 두 가지 문제를 해결합니다. 인스턴스를 생성하지 않는 클래스에서 사용할 수 있으며 컨테이너를 여러 클래스에 주입하지 않고도 어디에서나 사용할 수 있습니다.

내가 생각할 수있는 단점은 이전에 컨테이너에 액세스 할 수 없었던 여러 클래스에 내 컨테이너를 잠재적으로 노출시키고 있다는 것입니다. 비록 이것이 심지어 문제라면 정말로 확실하지 않은가?

답변

1

예,이 다운 사이트는 정말 나쁨이므로 피해야합니다. 당신이 그냥 정적으로 생각 반전

using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))) //here it will be created 
      { 
       container.BuildUp(CustomUserNameValidator.Current); //here you can inject all you need 
      } 

다음 코드를 작성해야 귀하의 경우에는, 서비스 호스트가 생성 될 때 서비스에 대해 한 번만 생성됩니다이

public class CustomUserNameValidator : UserNamePasswordValidator 
    { 
     public static CustomUserNameValidator Current { 
      get; private set; 
     } 

     public CustomUserNameValidator() { 
      Current = this; 
     } 

     public override void Validate(string userName, string password) 
     { 
      throw new FaultException("No pasaran"); 

     } 

     [Dependency] 
     public ISomeService Service { 
      get; set; 
     } 
    } 

과 같은 작업을 수행 할 수 있습니다 화합 컨테이너의 래퍼 :

+0

IIS를 통해 호스팅하므로 서비스 계약 생성자에서 BuildUp을 수행 할 수 있다고 생각합니다. 그러나 이것에도 여전히 단점이 있습니다. 공개적으로 서비스를 노출해야합니다 ...하지만 전체 컨테이너를 노출하는 것보다 훨씬 낫습니다. – Dannerbo

+0

또 다른 참고 사항 ... 내가 구성 파일을 사용하여 Unity에 대한 모든 객체를 매핑하기 때문에 원래의 정적 아이디어가 여전히 염려 스럽습니까? 유니티 컨테이너 인스턴스 주위에 정적 래퍼 클래스를 사용하지 않는다고 가정하면 코드의 아무 곳에 나 새로운 UnityContainer를 만들고 구성 파일을 사용하여 구성하고 원하는 모든 개체를 만들 수 있습니다. 따라서 UnityContainerWrapper 아이디어가 "이슈"를 만들고 있는지 확신 할 수 없으므로 기존 이슈를 더 눈에 띄게 만들고 있습니까? 그 말이 맞다면 ... – Dannerbo

+0

아마, 당신은 여러 개의 어셈블리를 가지고 있지만 단 하나만이 Unity를 인식하고 있습니다. 가장 높은 레벨이기 때문에 다른 컨테이너는 유니티 컨테이너를 전혀 만들 수 없습니다. 두 번째로 평생 관리입니다. 당신이 기대하는 다른 모든 동작을 얻을 수 있기 때문에 싱글 톤으로 두 개의 컨테이너를 만드는 것은 정말 큰 일입니다. 그래서 이것은 일종의 전통적인 것입니다. 그러나 그런 시나리오는 매우 희박합니다. –

관련 문제