문제

아마도 간단한 문제이지만, 어떻게 해야할지 전혀 모르는 이유 :

Unity (Prism) 및 정적 방법. 이 특별한 경우, 확장 방법. 그러나 일반적으로 정적 방법에서 "Unity 제공 인스턴스"에 어떻게 액세스합니까? 로깅 서비스를 생각해보십시오. 제가 정적 메소드 내부에서하고있는 일을 기록하는 데 액세스하고 싶습니다. 로깅을 사용할 때 심판을 통과해야합니까?

예제 (실제 문제에 가까운)

public static void HookupPrismEvent(ref UIElement, ILogger log) {...}

이상하게 보이면 컨테이너와 같이 (정적 결의)와 같이 더 빠진 것 같아요. 아무것도 찾지 못했지만 컨테이너, 유니티 또는 정적은 세계 최고의 검색어가 아닙니다. 아마도 나는 그것을 시도해야하지만 여전히 "이상한"느낌이 든다 ..

그래서 정적 방법에서 DI를 사용하는 방법에 대한 의견이 있습니까?

크리스

편집 - OK, 대답 후 현재 접근 방식 : edit2, 생각 후 컨테이너를 제거하여 "필요한 것"을 제공합니다 ....

  public static void AttachPrismEvents(this UIElement element, IEventAggregator eA)
    {
        var ev = eA.GetEvent<KeyPressedEvent>();
        element.KeyDown += ((sender, e) => ev.Publish(e));
    }

또는 로깅과 함께 :

  public static void AttachPrismEvents(this UIElement element, ILogger log, IEventAggregator eA)
    {
        log.Debug("Doing stuff");
        var ev = eA.GetEvent<KeyPressedEvent>();
        element.KeyDown += ((sender, e) => ev.Publish(e));
    }
도움이 되었습니까?

해결책

정적 유형과 멤버는 일반적으로 모든 것의 적입니다.

기술적으로, 정적 결의 방법을 가질 수는 있지만 DI가 아니라 서비스 로케이터로 알려진 패턴이 될 수 있습니다. 그러나 많은 사람들 (나 자신이 포함 된)은 서비스 로케이터를 여러 가지 이유로 반포 반으로 고려합니다.

  • API의 사용 요구 사항에 대해 암시 적 가정을합니다 (호출자는 멤버를 호출하기 전에 서비스 로케이터를 올바르게 구성해야한다는 것을 알지 못합니다).
  • 컨테이너를 둥지하는 것은 불가능 해집니다
  • 서비스 로케이터 자체에 중복 의존성을 소개합니다.

정적 메소드가 있어야한다면 메소드 주입을 통해 종속성을 전달해야하지만 전체 API 설계를 재고하는 것이 종종 더 유리하다고 생각합니다. 종종 원하는 기능은 대신 입력 매개 변수 중 하나에서 구성원으로 모델링 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top