Frage

Ich schreibe ein C # .NET-Modul, und ich mag das Provider Muster verwenden.

Wenn mein Code auf einem Webserver ausgeführt wird, habe ich Zugriff auf System.Web.Configuration und ProvidersHelper nennen kann einen geeigneten Anbieter zu laden, wie durch die web.config Daten bestimmt.

Wenn mein Code in einer eigenständigen Umgebung ausgeführt wird, werde ich habe keinen Zugriff auf diese Klasse.

Es scheint mir, dass ich vielleicht eine Wrapper-Klasse zu schreiben, die Reflexion auf (a) bestimmen, verwendet, wenn ich das in System.Web.Configuration.ProvidersHelper gebaut bekommen, und wenn nicht, (b) eine funktional äquivalente Schnittstelle bieten, die nur auf die verlassen würden Ressourcen ich habe im Standalone-Modus zur Verfügung.

Hat jemand da draußen kommt über dieses Problem vor und / oder Anregungen?

War es hilfreich?

Lösung

Wenn Sie die Referenz auf der System.Web Montage vermeiden möchten, müssen Sie eine Schnittstelle erstellen müssen, die die Informationen, die Sie interessiert sind aussetzt und erhalten Sie Ihre Verbraucher Implementierer dieser Schnittstelle entsprechend zu bieten:

// 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());

Dieses Muster wird als Dependency Injection und Inversion of Control .

Andere Tipps

Überprüfen Sie, ob HttpContext.Current nicht null ist:

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

Sie einen Status erstellen können Web-Funktion, die zurückgibt, ob oder nicht HttpContext.Current null ist.

Wenn es nicht null ist Sie eine Website haben, wenn es null ist, können Sie dies nicht tun.

Wenn Sie ein Modul schreiben, welcher entweder von Web-basierten oder nicht-webbasierte Anwendungen zugegriffen werden kann, die richtige Weg ™ die Konfiguration, IMHO zu handhaben, den Client-Code haben, ist sagen Sie in welcher Umgebung Sie sind in. Dies sollte eine kleine Erhebung auf den Client-Code, und erheblich die Komplexität des Codes reduzieren. Eine mögliche Lösung wäre, den Client-Pass in einem Objekt zu haben, die auf die gleiche Schnittstelle entspricht (wenn auch ein kurzer Blick auf der MSDN-Dokumentation zeigt, dass es nicht eine Schnittstelle für ProvidersHelper definiert, so dass der einfache Weg heraus ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top