Pregunta

Estoy escribiendo un módulo C # .NET y me gustaría utilizar el patrón de proveedor.

Si el código se ejecuta en un servidor web, tengo acceso a System.Web.Configuration y puedo llamar ProvidersHelper para cargar un proveedor apropiado según lo determinado por los datos web.config.

Si el código se ejecuta en un entorno autónomo, no voy a tener acceso a esta clase.

Me parece que yo podría escribir una clase contenedora que utiliza la reflexión para (a) determinar si puedo conseguir que el construido en System.Web.Configuration.ProvidersHelper, y si no, (b) proporcionar una interfaz funcionalmente equivalente que confiar sólo en el los recursos que tienen disponibles en el modo autónomo.

¿Alguien por ahí encontrará con este problema antes y / o tiene alguna sugerencia?

¿Fue útil?

Solución

Si se quiere evitar la referencia en el conjunto System.Web, que tendrá que crear una interfaz que expone la información que le interesa y obtener sus consumidores para proporcionar los ejecutores de esta interfaz cuando sea apropiado:

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

Este patrón se llama inyección de dependencias y Inversión de control .

Otros consejos

Compruebe si HttpContext.Current no es nulo:

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

Se puede crear un estado es una función que devuelve Web o no HttpContext.Current es nulo.

Si no es nula usted tiene un sitio web, si es nulo, no lo hace.

Si estás escribiendo un módulo que se puede acceder desde las aplicaciones no basadas en Web, ya sea basado en la web o bien, de la manera correcta ™ para manejar la configuración, en mi humilde opinión, es tener el código de cliente dicen lo que el medio ambiente que se encuentre. Esto debe ser una imposición de menor importancia en el código de cliente, y reducir en gran medida la complejidad de su código. Una posible solución sería tener el pase cliente en un objeto que se ajusta a la misma interfaz (aunque un rápido vistazo a la documentación de MSDN muestra que no hay una interfaz definida para ProvidersHelper, por lo que la ruta fácil está fuera).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top