2013-11-01 75 views
4

我在寫一個Active Directory包裝器,試圖遵循SOLID和其他最佳實踐。界面目前是「IActiveDirectory」。如何防止泄漏抽象?

我現在的問題是,實現ActiveDirectory必須實現IDisposable來處置創建和處理這個包裝內的一些資源,我不知道如何解決這個問題,而試圖編碼到接口等等......我不想創建一個漏洞抽象(即裝飾IActiveDirectory w/IDisposable)。我不能將服務細化(即將方法調用創建/處理資源的範圍設置爲方法調用),這是由於底層的依賴關係。

我目前有一個工廠,以便IActiveDirectory的消費者可以創建一個按需,但我需要一個乾淨,方便的方式讓消費者用信號完成資源。

如何在不泄漏資源包裝的抽象的情況下向消費者提供合同(即接口)?我應該公開實現sans一個接口嗎?我的消費者或我的DI容器是否有辦法管理此服務的生命週期?

+2

「我需要一個乾淨,方便的方式讓消費者用信號完成信號。」 - 這正是「IDisposable」的意思。你不能抽象所有*。 – delnan

+0

是的,我知道這正是IDisposable是什麼,我沒有問題把它放在具體的類。然而,我不喜歡把它放在一個接口上,因爲我創建了一個漏洞抽象,我假設所有的實現都需要一個Dispose方法調用,違反了Liskov。你認爲只是將具體的sans接口暴露出來會更好嗎? –

+0

這是完全有效的,在LSP和其他條件下,「Dispose」什麼也不做。把它放在一個接口上並不意味着假設所有的實現都需要配置(任何不能簡單地添加'void Dispose(){}')的實現,這意味着假設*一些實現需要配置(這是真實的)。 – delnan

回答

0

一方面,處置資源的責任落在獲得資源的人身上。您的客戶端不會創建ActiveDirectory,工廠不會 - 因此在概念上,工廠必須處理ActiveDirectory。

這很難,但可以實現。 Web應用程序的一個示例是,您可以將工廠範圍限制爲請求範圍,並且在請求完成時安全地將其置於活動目錄中。另一個例子是當你的實例由IoC容器管理時,它知道如何處理IDisposable(NInject有一些棘手的黑客來做這件事)。然後,如果這不適用於你,你應該承認通用解決方案不是最高性能的(這根本不奇怪),如果你仍然想抽象,你可以創建額外的抽象IActiveDirectorySession其中明確表示與AD的通信會話,並且由於非常自然的原因必須實現IDisposable,至少。

+0

我的想法。我已經使用了環境上下文模式來創建一個準會話,通過該會話,在調用上下文的Dispose時,在服務的保護下創建的任何對象都將被「註冊」以進行處理。在這種情況下,使用IoC來管理生命期實際上是不可能的,因爲我認爲在需要很長時間之前打開「會話」並關閉很長時間是不可接受的。 –