In pratica, ho una classe Engine che riceve un comando come stringa dall'input e lo passa a una classe CommandHandler che esegue il comando appropriato.
CommandHandler passa la stringa a CommandFactory per ottenere il comando e chiama il metodo Execute () del comando, ma il problema è che ogni comando dipende da diverse classi da eseguire correttamente. Ad esempio, un comando necessita di IOutputWriter per scrivere qualcosa, l'altro ha bisogno di IBuldingFactory per creare un edificio, ecc. Sto usando un reflection nella classe CommandFactory e non posso passare le dipendenze tramite il costruttore usando Activator.CreateInstance () , perché ogni comando ha dipendenze diverse.
La mia architettura attuale è simile a questa:
class Engine()
{
IData data; // application database
IInputReader inputReader;
ICommandHandler commandHandler;
public void Run()
{
string command = inputReader.Read();
commandHandler.Handle(command, data);
}
}
class CommandHandler()
{
ICommandFactory commandFactory();
public void Handle(string command, IData data)
{
string executableCommand = commandFactory().createCommand(command);
executableCommand.Execute(data);
}
}
class DisplayDataCommand : ICommand
{
IOutputWriter outputWriter;
public void Execute(IData data)
{
outputWriter.Print(data.ToString());
}
}
class BuildCommand : ICommand
{
IBuildingFactory buildingFactory;
string buildingType;
public void Execute(IData data)
{
var building = buildingFactory.createBuilding(buildingType);
data.AddBuilding(building);
}
}
Posso avere metodi diversi nel gestore di comando per ogni comando e chiamare il metodo appropriato usando il caso dell'interruttore, ma ciò violerebbe il principio Aperto / Chiuso. Quindi la mia vera domanda è: come implementare ciò senza violare il principio Open / Closed.