Pregunta

Estoy repensando un servicio WCF actual que estamos usando en este momento. Hacemos mucho XML de carga a varias bases de datos. En algunos casos, podemos almacenarlo como datos XML, y en otros, necesitamos almacenarlo como redes.

Así que estoy rediseñando este servicio para aceptar diferentes proveedores. Mi primer pensamiento, clásica fábrica abstracta, pero ahora tengo mis dudas. Esencialmente, la clase de servicio tiene un método de contrato de operación, carga. Pero para mí, parece una tontería para las nuevas instancias del proveedor cada vez que se llama a la carga.

Corrientemente:

// Obviously incomplete example:
public class XmlLoaderService : IXmlLoaderService
{
    readonly IXmlLoaderFactory _xmlLoaderFactory;
    readonly IXmlLoader _xmlLoader;

    public XmlLoaderService()
    {
        _xmlLoader = _xmlLoaderFactory(ProviderConfiguration configuration);
    }

    public void Load(Request request)
    {
        _xmlLoader.Load(request);
    }
}

Estoy pensando en cambiar a:

public class XmlLoaderService : IXmlLoaderService
{
    static readonly IDictionary<int, IXmlLoader> _providerDictionary;

    static public XmlLoaderService()
    {
        _providerDictionary = PopulateDictionaryFromConfig();
    }

    public void Load(Request request)
    {
        // Request will always supply an int that identifies the
        // request type, can be used as key in provider dictionary

        var xmlLoader = _providerDictionary[request.RequestType];
        xmlLoader.Load(request);
    }
}

¿Es este un buen enfoque? Me gusta la idea de almacenar en caché a los proveedores, me parece más eficiente ... Sin embargo, tiendo a pasar por alto lo obvio a veces. ¡Déjame saber lo que piensas!

¿Fue útil?

Solución

¿Por qué no puedes usar ambos? Pasar su dependencia a la Load Método y si el tipo ya está en caché, use la instancia en caché.

public void Load(Request request)
{
    // Request will always supply an int that identifies the
    // request type, can be used as key in provider dictionary

    IXmlLoader xmlLoader;
    if(_providerDictionary.ContainsKey(request.RequestType))
    {
        xmlLoader = _providerDictionary[request.RequestType];
    }
    else 
    {
        xmlLoader =  //acquire from factory
        _providerDictionary.Add(request.RequestType, xmlLoader);
    }
    xmlLoader.Load(request);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top