2009-08-06 7 views
2

Ist der Verweis auf System.Windows.Forms in einer Business-Klasse und die Verwendung von MessageBox.Show falsch?Ist das Meldungsfeld in der Business-Klasse falsch?

Momentan haben eine Event-Processing-Decorator-Klasse eine Service-Klasse dekorieren. Wenn bestimmte Ereignisse ausgelöst Dekorator möchten Benutzer fragen, ob sie mit der Verarbeitung bestimmter Funktionen fortfahren möchten.

Ist es in Ordnung für diese Dekorator-Klasse haben diese Meldungsfelder?

Antwort

11

Sie sollten nie eine Benutzeroberfläche in einer Business-Klasse haben.

Der Grund dafür ist, dass Sie nie wissen, wie Ihre Business-Klasse verwendet werden könnte. Vielleicht wird es in einer neuen Website, einem Webdienst, einem Windows-Dienst usw. verwendet. In all diesen Fällen wäre ein Meldungsfeld unpassend.

Der richtige Weg, um dies zu behandeln, ist die Bereitstellung eines Ereignisses, das Ihre Benutzerschnittstelle oder jeder andere Verbraucher Ihrer Business Class abonnieren kann. Lassen Sie die UI-Ebene entscheiden, ob ein Meldungsfeld angezeigt wird oder nicht.

Sie sollten sich sicherlich auch einige der Logging-Frameworks ansehen und wahrscheinlich dieses Ereignis protokollieren.

+0

Wie würde ich die Antwort zurück, wenn ich das Ereignis bis zur Benutzeroberfläche fire? Wie würde ich wissen, wenn sie Ja oder Nein auf dem Meldungsfeld anzeigen? – c00ke

+0

Das Ereignis würde durch den EventArgs-Parameter die Antwort zurückgeben. In einigen Fällen könnte Code Behandeln Sie das Ereignis, indem Sie einfach die Flagge setzen und zurückgeben, so dass Sie die Entscheidung treffen, anstatt den Benutzer zu fragen –

+1

Grundidee: 1. Definieren Sie ein benutzerdefiniertes Ereignis in Ihrem Unternehmen. Objekt, z.B. serviceNotificationEvent oder ähnliches. 2. Im Ort, den Sie eine MessageBox erwägen, statt so etwas tun: (! ServiceNotificationEvent = null) wenn { serviceNotificationEvent (neu ServiceNotificationEventArgs (some, Moredata)); } 3. Abonnieren Sie in Ihrer UI ServiceNotificationEvent, z. B .: myServiceObject.ServiceNotificationEvent + = new ServiceNotificationEventHandler(); Der obige Code ist Pseudocode.Informieren Sie sich hier über die Ereignisse, um Details zu konkretisieren. http://www.akadia.com/services/dotnet_delegates_and_events.html –

3

Nachrichtenboxen sind wahrscheinlich überall falsch. Ich kann Ihnen das Ergebnis schon sagen, bevor Sie es gezeigt haben. Benutzer klicken auf Abbrechen. Sie tun es immer. Wenn Sie zu einem späteren Zeitpunkt die gleiche Message Box nicht mehr verwenden, klicken Ihre Benutzer auf "Weiter", weil "Abbrechen" nicht das getan hat, was sie wollten.

Also, wenn Sie bereits die Antwort wissen, warum die Frage zu stellen?

+0

+1 einsichtsvoll :) –

3

In der Geschäftsklasse sollten Sie NIEMALS direkte Kommunikation über die Benutzeroberfläche verwenden.

Es ist, weil die Benutzeroberfläche winforms/webforms/console/smart_devices/etc ... oder keine Benutzeroberfläche verwendet werden kann (in Skripten zum Beispiel).

Wenn Sie einige Benutzer-entscheiden müssen im Geschäftsprozess können Sie mehrere Möglichkeiten, wie das zu verwenden. In .NET ist einer der einfachsten Weg Ereignisse.

Zum Beispiel:

public class MyBussinesClass { 
    public void DoSomeBussinesRelatedWork() { 
     // ... some code and then you need a users decision 
     var argWhichCurrencyToUse = new DecisionEventArgs { 
      Title = "Currency selection", 
      Text = "Which currency you want to use in bill?", 
      Answer = "USD" 
     }; 
     this.OnDecisionRequred(argWhichCurrencyToUse); 
     // ... contine in work ... 
    } 

    protected void OnDecisionRequired(DecisionEventArgs e) { 
     // run the event 
    } 
    public event EventhHandler<DecisionEventArgs> DecisionRequired; 
} 

public class DecisionEventArgs { 
    public string Title {get;set;} 
    public string Text {get;set;} 
    public object Answer {get;set;} 
} 

Die Benutzeroberfläche kann dann die Ereignisse Haken und zeigen die richtige UI (messagebox, inputbox, Webformular, Konsole lesen/schreiben, etc ....