2016-07-11 17 views
4

enter image description here Mein Befehl und Handler ist in zwei verschiedenen Schichten. Ich möchte zu meinem Kommando wie ein POCO sein und nichts über seinen Hundeführer wissen. Die Lösung, die in meinem Kopf kam so etwas wie diese:Decouple Befehl von seinem Handler

public interface ICommand 
{ 
    string GetHandler(); 
} 

public interface ICommandHandler 
{ 
    void HandleCommand(ICommand command); 
} 

public class XCommand : ICommand 
{ 
    //... 
    public string GetHandler() 
    { 
     return "xh"; 
    } 
} 

[Handler("xh")] 
public class XCommandHandler : ICommandHandler 
{ 
    public void HandleCommand(ICommand command) 
    { 
     //handle 
    } 
} 

Ist das ein Befehl Muster?

+0

Dies sieht wie Command/Query Response Separation (CQRS) –

+0

Das Verb 'handle' ist ein wenig mehrdeutig. Ihre Frage wäre klarer, wenn Sie ein konkretes Beispiel für die tatsächliche Handhabung eines Befehls geben würden. Das Problem ist, dass im Muster ['Command'] (http://stackoverflow.com/a/35295617/1168342) eine 'execute()' Methode existiert, die den Befehl ausführt. Wenn Sie das mit handle meinen, dann ist es, wie @ jaco0646 sagte, in den Befehl selbst eingekapselt. Auf der anderen Seite (kein Wortspiel beabsichtigt), ist der "Aufrufer" vollständig von Befehlen im klassischen Muster entkoppelt. Der Aufrufer "handhabt" die Befehle, ruft aber nur 'execute()' auf ihnen auf. – Fuhrmanator

+1

Wie Sie gesagt haben, könnte die Verwendung von "command" und "handle" verwirrend sein. Ich habe FindRequest und Finder und möchte diese Objekte entkoppeln. Also erstelle ich einen FindExecuter, den Client Pass FindRequest auszuführen. Ich habe ein Bild in den obigen Beitrag, um das Problem zu klären. –

Antwort

2

Nein, die Command Pattern kapselt "Handler" -Logik in das Befehlsobjekt selbst ein, was zu einer Blackbox führt, die überall ausgeführt werden kann. Mit anderen Worten, es gibt keine Handler-Rolle im Befehlsmuster. Ihre Sorge ist , wenn und wie ein Befehl ausgeführt wird, anstatt Wer führt die Ausführung.

Es gibt jedoch mehrere andere behavioral patterns zu bestimmen, wer eine Anfrage oder ein Ereignis behandelt. Bemerkenswerterweise passen die Befehlsketten und Observer Muster diese Anforderung.

+0

Danke, ich denke, wie Peter sagte, es sieht aus wie CQRS. –