2009-04-13 130 views
0

我正在編寫一個C#.NET模塊,我想使用提供程序模式。如何判斷我是否在網絡服務器下運行?

如果我的代碼是Web服務器上運行,我有機會獲得System.Web.Configuration並且可以調用ProvidersHelperweb.config數據確定加載合適的供應商。

如果我的代碼在獨立環境中運行,我將無法訪問此類。 (a)確定我是否可以到達內置的System.Web.Configuration.ProvidersHelper,如果沒有,(b)提供一個功能上等價的接口,它只依賴於我在獨立模式下可用的資源。

有沒有人遇到過這個問題之前和/或有建議?看到

回答

0

如果你想避免在System.Web組裝的參考,你就必須創造暴露你感興趣的,讓你的消費者提供此接口的實現適當的信息的界面:

// Core assembly, doesn't reference System.Web 
public class ThisUsesProviders { 
    public ThisUsesProviders(IProviderProvider pp) { ... } 
} 

public interface IProviderProvider { 
    SpecialProvider InstantiateSpecialProvider(/* custom arguments */); 
} 

// Helper assembly, references System.Web 
public class DefaultProviderProvider : IProviderProvider 
{ 
    SpecialProvider InstantiateSpecialProvider(/* custom arguments */) 
    { 
     // call ProvidersHelper 
    } 
} 

// standalone consumer: 
var thing = new ThisUsesProvider(new NonStandardProvider()); 

// ASP.NET: 
var thing = new ThisUsesProvider(new DefaultProviderProvider()); 

這種模式被稱爲Dependency InjectionInversion of Control

3

檢查是否HttpContext.Current不爲空:

if(HttpContext.Current!=null) 
    // I'm running on a web server 
+0

謝謝,但不幸的是,如果我在獨立模式下運行,我也無法訪問System.Web,因此我無法編譯該代碼。 如果MS已將ProvidersHelper放入非Web類中,我的問題就會出現問題。 – 2009-04-13 19:20:36

+0

鑑於您的項目將引用System.Web(或它不會編譯),您*應該*有權訪問System.Web。 – Powerlord 2009-04-13 19:25:56

+0

爲了響應R.Bemrose,代碼被用於兩個不同的程序集,其中只有一個是Web服務器。一個項目有一個System.Web的引用,而另一個不需要一個(除了這個依賴)。 – 2009-04-14 17:55:17

0

您可以創建返回是否HttpContext.Current爲null,則統計的IsWeb功能。

如果它不是空的,你有一個網站,如果它是空的,你不。

0

如果你正在編寫,可以從非基於網絡或者基於Web或應用程序訪問的模塊,正道™爲處理配置,恕我直言,是讓客戶端代碼告訴你什麼你所處的環境。這應該是對客戶代碼的輕微強加,並且大大降低你的代碼的複雜性。一種可能的解決方案是讓客戶端傳入符合相同接口的對象(儘管快速瀏覽一下MSDN文檔顯示沒有爲ProvidersHelper定義接口,因此簡單的路由不存在)。

相關問題