Dânêl
09-08-2012, 11:32
Ciao,
mi ritrovo con un piccolo problema nel progetto che sto attualmente sviluppando e volevo cheidere un vostro parere.
Il software opera su alcuni dati che legge/salva su file mediante opportune classi fileReader/fileWriter derivate da una classe astratta. Poichè in futuro si potrebbe decidere di salvare i dati in modalità/formati diversi ho pensato di implementare una abstract factory che in base all'estensione del file restituisce l'istanza della classe associata a quel formato (per esempio txtFileReader, XmlFileReader).
Vorrei però evitare un approccio "hard-coded" con un lungo switch, anche perchè parte del progetto sarà esportato sottoforma di dll e vorrei dare la possibilità di espandere l'abstract factory anche a chi non possiede il sorgente, ma che potrebbe implementare dei propri reader/writer.
Ho pensato di creare una classe AbstractFactory, statica, contenente due dizionari <string, type> che diano le associazioni estensione -> classe:
public static class DataFileFactory
{
public static Dictionary<string,Type> ReaderAssociation = new Dictionary<string,Type>();
public static Dictionary<string,Type> WriterAssociation = new Dictionary<string,Type>();
public static DataFileReader GetReader(string filename)
{
string fileExtension = System.IO.Path.GetExtension(filename).TrimStart('.').ToLowerInvariant();
ConstructorInfo constructor = DataFileFactory.ReaderAssociation[fileExtension].GetConstructor(new Type[] {typeof(string)});
return (DataFileReader)constructor.Invoke(new object[] {filename});
}
public static DataFileWriter GetWriter(string filename)
{
string fileExtension = System.IO.Path.GetExtension(filename).TrimStart('.').ToLowerInvariant();
ConstructorInfo constructor = DataFileFactory.WriterAssociation[fileExtension].GetConstructor(new Type[] {typeof(string)})
return (DataFileWriter)constructor.Invoke(new object[] {filename});
}
}
Ero curioso di sapere se questo approccio può comportare dei problemi e se esistono delle soluzioni migliori. Grazie :)
mi ritrovo con un piccolo problema nel progetto che sto attualmente sviluppando e volevo cheidere un vostro parere.
Il software opera su alcuni dati che legge/salva su file mediante opportune classi fileReader/fileWriter derivate da una classe astratta. Poichè in futuro si potrebbe decidere di salvare i dati in modalità/formati diversi ho pensato di implementare una abstract factory che in base all'estensione del file restituisce l'istanza della classe associata a quel formato (per esempio txtFileReader, XmlFileReader).
Vorrei però evitare un approccio "hard-coded" con un lungo switch, anche perchè parte del progetto sarà esportato sottoforma di dll e vorrei dare la possibilità di espandere l'abstract factory anche a chi non possiede il sorgente, ma che potrebbe implementare dei propri reader/writer.
Ho pensato di creare una classe AbstractFactory, statica, contenente due dizionari <string, type> che diano le associazioni estensione -> classe:
public static class DataFileFactory
{
public static Dictionary<string,Type> ReaderAssociation = new Dictionary<string,Type>();
public static Dictionary<string,Type> WriterAssociation = new Dictionary<string,Type>();
public static DataFileReader GetReader(string filename)
{
string fileExtension = System.IO.Path.GetExtension(filename).TrimStart('.').ToLowerInvariant();
ConstructorInfo constructor = DataFileFactory.ReaderAssociation[fileExtension].GetConstructor(new Type[] {typeof(string)});
return (DataFileReader)constructor.Invoke(new object[] {filename});
}
public static DataFileWriter GetWriter(string filename)
{
string fileExtension = System.IO.Path.GetExtension(filename).TrimStart('.').ToLowerInvariant();
ConstructorInfo constructor = DataFileFactory.WriterAssociation[fileExtension].GetConstructor(new Type[] {typeof(string)})
return (DataFileWriter)constructor.Invoke(new object[] {filename});
}
}
Ero curioso di sapere se questo approccio può comportare dei problemi e se esistono delle soluzioni migliori. Grazie :)