Design del dizionario del fornitore statico
-
29-10-2019 - |
Domanda
Sto ripensando a un attuale servizio WCF che stiamo usando in questo momento. Facciamo un sacco di caricamento di XML su vari database. In alcuni casi, possiamo archiviarli come dati XML e, in altri, dobbiamo archiviarli come vasi.
Quindi sto ridisegnando questo servizio per accettare diversi fornitori. Il mio primo pensiero, classica fabbrica astratta, ma ora ho i miei dubbi. In sostanza, la classe di servizio ha un metodo del contratto operativo, caricamento. Ma per me, sembra sciocco per le istanze del fornitore di nuovi utenti ogni volta che il carico viene chiamato.
Attualmente:
// 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);
}
}
Sto pensando di cambiare in:
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);
}
}
è un buon approccio? Mi piace l'idea di memorizzare nella cache i fornitori, mi sembra più efficiente ... Tuttavia, a volte tendo a trascurare l'ovvio. Fatemi sapere i vostri pensieri!
Soluzione
Perché non puoi usare entrambi? Passare nella tua dipendenza nel Load
Metodo e se il tipo è già memorizzato nella cache, utilizzare l'istanza memorizzata nella cache.
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);
}