Diseño del diccionario de proveedores estáticos
-
29-10-2019 - |
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!
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);
}