Question

J'écris un C # module .NET et je voudrais utiliser le modèle de fournisseur.

Si mon code est en cours d'exécution sur un serveur web, j'ai accès à System.Web.Configuration et peut appeler ProvidersHelper pour charger un fournisseur approprié tel que déterminé par les données de web.config.

Si mon code est en cours d'exécution dans un environnement autonome, je ne vais pas avoir accès à cette classe.

Il me semble que je pourrais écrire une classe wrapper qui utilise la réflexion pour (a) de déterminer si je peux arriver à la construction dans System.Web.Configuration.ProvidersHelper, et sinon, (b) fournir une interface fonctionnelle équivalente qui reposerait uniquement sur la les ressources dont je dispose en mode autonome.

Quelqu'un at-il là-bas sur cette question avant et / ou des suggestions?

Était-ce utile?

La solution

Si vous voulez éviter la référence sur l'ensemble de System.Web, vous devrez créer une interface qui expose les informations qui vous intéressent et obtenez vos consommateurs pour fournir implementors de cette interface, selon le cas:

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

Ce modèle est appelé injection de dépendances et Inversion de contrôle .

Autres conseils

Vérifiez si HttpContext.Current est non nulle:

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

Vous pouvez créer un état est fonction Web qui renvoie ou non HttpContext.Current est nulle.

Si ce n'est pas nul que vous avez un site Web, si elle est nulle, vous ne le faites pas.

Si vous écrivez un module qui est accessible à partir soit applications non-web ou sur le Web, la bonne manière ™ pour gérer la configuration, à mon humble avis, est d'avoir le code client dire quel environnement vous êtes. Cela devrait être une imposition mineure sur le code client, et de réduire considérablement la complexité de votre code. Une solution possible serait d'avoir le passage du client dans un objet qui est conforme à la même interface (mais un rapide coup d'œil à la documentation MSDN montre qu'il n'y a pas une interface définie pour ProvidersHelper, de sorte que la voie facile est hors).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top