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!

È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top