Domanda

Sto scrivendo un modulo C # .NET e vorrei utilizzare il modello di provider.

Se il mio codice è in esecuzione su un server web, ho accesso a System.Web.Configuration e posso chiamare ProvidersHelper per caricare un provider appropriato come determinato dai dati web.config.

Se il mio codice è in esecuzione in un ambiente autonomo, non voglio avere accesso a questa classe.

Mi pare che potrei scrivere una classe wrapper che utilizza la reflection per (a) determinare se posso ottenere per il costruito nel System.Web.Configuration.ProvidersHelper, e se non, (b) fornire un'interfaccia funzionalmente equivalente che contare solo sulla risorse che hanno a disposizione in modalità stand-alone.

Qualcuno là fuori incontrato questo problema prima e / o avete suggerimenti?

È stato utile?

Soluzione

Se si vuole evitare il riferimento sul gruppo System.Web, dovrete creare un'interfaccia che espone le informazioni che ti interessa e ottenere i vostri consumatori per fornire implementatori di questa interfaccia a seconda dei casi:

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

Questo modello è chiamato Dependency Injection e Inversion of Control .

Altri suggerimenti

Controlla se HttpContext.Current non è nullo:

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

È possibile creare una funzione di stato è Web che restituisce o meno HttpContext.Current è null.

Se non è nulla che hai un sito web, se si tratta di nulla, non lo fai.

Se si sta scrivendo un modulo che si può accedere da applicazioni basate su web non sia basata sul Web o, il modo giusto ™ per gestire la configurazione, secondo me, è quello di avere il codice del client dire voi quale ambiente ci si trova. Questa dovrebbe essere un'imposizione minore sul codice del client, e di ridurre notevolmente la complessità del codice. Una possibile soluzione sarebbe quella di avere il pass cliente in un oggetto che è conforme alla stessa interfaccia (anche se un rapido sguardo la documentazione MSDN mostra non c'è un'interfaccia definita per ProvidersHelper, quindi la strada più facile è fuori).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top