2013-11-01 4 views
4

저는 SOLID 및 기타 모범 사례를 따르려고하는 Active Directory 래퍼를 작성하고 있습니다. 인터페이스는 현재 "IActiveDirectory"입니다.누출 추상화를 방지하려면 어떻게해야합니까?

내가 지금 가지고있는 문제는 구현 된 ActiveDirectory가이 래퍼 내부에 생성되고 처리되는 몇 가지 리소스를 처리하기 위해 IDisposable을 구현해야한다는 것이며 인터페이스에 코드를 작성하는 동안이 문제를 해결하는 방법을 모르겠습니다. , 등등 ... 나는 누출 추상화 (즉, IAisiveDirectory/IDisposable 꾸미기)를 만들고 싶지 않습니다. (예 : 메소드 호출에 대한 자원의 생성/폐기 범위 지정) 서비스를 세밀하게 만들 수 없습니다. 기본 종속성.

저는 현재 IActiveDirectory의 소비자가 주문형 제품을 만들 수있는 공장을 가지고 있지만 소비자가 리소스로 완료되었음을 알리는 깨끗하고 편리한 방법이 필요합니다.

리소스 래퍼를 추상화하지 않고 소비자에게 계약 (즉 인터페이스)을 제공하려면 어떻게해야합니까? 구현물에 인터페이스가 없다는 것을 공개해야합니까? 소비자 또는 DI 컨테이너가이 서비스의 수명을 관리 할 수있는 방법이 있습니까?

+2

"소비자가 리소스로 완료되었음을 알리는 깨끗하고 편리한 방법이 필요합니다." - 그게 바로'IDisposable' 이죠. * 모든 것을 추상화 할 수는 없습니다. – delnan

+0

예 저는 IDisposable이 정확히 무엇인지 알고 있습니다. 그리고 구체적인 수업에 문제가 없습니다. 그러나 나는 모든 구현체가 Liskov를 위반하는 Dispose 메서드 호출이 필요하다고 가정함으로써 누출 된 추상화를 생성하기 때문에 인터페이스에 배치하는 것을 싫어합니다. 콘크리트 산을 인터페이스에 노출시키는 것이 더 낫다고 생각합니까? –

+0

LSP 및 다른 기준에 따라 'Dispose'가 아무 것도하지 않는 것이 타당합니다. 인터페이스 상에 두는 것은 모든 구현이 폐기가 필요하다고 가정하는 것을 의미하지는 않습니다. (단순히'void Dispose() {}'를 추가 할 수없는 구현이라면, 일부 구현은 폐기해야한다고 가정한다는 것을 의미합니다. – delnan

답변

0

한편으로 자원을 처분 할 책임은 인수 한 사람에게 있습니다. 귀하의 클라이언트는 ActiveDirectory를 생성하지 않습니다. 공장은 개념 상으로 공장에서 ActiveDirectory를 처리해야합니다.

어렵지는 않지만 달성 할 수 있습니다. 예를 들어 공장 범위를 요청 범위로 제한하고 요청이 완료되면 활성 디렉토리로 안전하게 배치 할 수있는 웹 애플리케이션이 그 예입니다. 또 다른 예는 인스턴스가 IDisposable (NInject가이 작업을 수행하는 데 까다로운 해킹이 있음)을 처리하는 방법을 알고있는 IoC 컨테이너에 의해 관리되는 경우입니다.

그렇다면 해당 사항이 적용되지 않는 경우 일반 솔루션이 가장 효과적이지 않음을 인정해야하며 (여전히 놀라운 것은 아닙니다) 여전히 추상화하고 싶다면 추가 추상화 IActiveDirectorySession을 만들 수 있습니다 이는 AD와의 통신 세션을 명시 적으로 나타내고 최소한 자연스러운 이유로 IDisposable을 구현해야했습니다.

+0

내 생각은 정확하게. 나는 Ambient Context 패턴을 사용하여 컨텍스트의 Dispose가 호출 될 때 서비스 우산 아래 생성 된 모든 객체가 폐기를 위해 "등록"되는 준 세션을 만들었습니다. IoC를 사용하여 수명을 관리하는 것은 사실상 불가능합니다. 왜냐하면 필자는 오래 전에 "세션"을 열어 두는 것이 용납 할 수없는 일이라고 생각하기 때문에 사실상 불가능합니다. –

관련 문제