Sto lavorando al software per riprodurre i file di registro. Disponiamo di diversi tipi di log da diversi provider.
Ho creato un'interfaccia che diverse classi implementeranno per riprodurre registri diversi. Ad esempio, ClassA
passerà "somelog.txt" dal ProviderA, ClassB
gestirà "another.log" dal ProviderB, ecc.
public interface ILogServer
{
bool IsThisYourFile(string fileName, string[] content);
// Other stuff not relevant to the question....
}
Uso una fabbrica per creare l'oggetto. Per ogni classe, la factory chiama IsThisYourFile()
che valuta il nome del file e / o il contenuto per determinare se il file è del tipo che gestisce.
Idealmente creerei IsThisYourFile
static ma non è permesso. Voglio usare reflection per ottenere tutte le classi che implementano ILogServer
e chiama questa funzione.
var types = from type in Assembly.GetExecutingAssembly().GetTypes()
where type.GetInterface("ILogServer") != null
select type;
foreach (var t in types)
{
// Call the static function
if ((bool)t.GetMethod("IsThisYourFile").Invoke(null, new object[] { fileName, content }))
{
server = (ILogServer)Activator.CreateInstance(t);
break;
}
}
In questo modo, creo solo un oggetto, invece di creare un oggetto di ogni classe finché non viene trovato quello giusto, lasciando gli altri al GC.
La mia soluzione attuale è rimuovere IsThisYourFile
dall'interfaccia e ricordati di implementarla in ogni classe come una funzione static
. Ma non sembra giusto.
Mi chiedo come gli altri potrebbero implementarlo.