Неправильно ли иметь окно сообщений в бизнес-классе? - PullRequest
2 голосов
/ 06 августа 2009

Имеет ли ссылка на System.Windows.Forms в бизнес-классе и использует MessageBox.Show неправильно?

В настоящее время имеется класс декоратора обработки событий, украшающий класс обслуживания. При возникновении определенных событий декоратор хотел бы спросить пользователя, хотят ли они продолжить обработку определенных функций.

Это нормально для этого класса декоратора, иметь эти окна сообщений?

Ответы [ 3 ]

11 голосов
/ 06 августа 2009

У вас никогда не должно быть пользовательского интерфейса в бизнес-классе.

Причина в том, что вы никогда не знаете, как ваш бизнес-класс может быть использован в будущем. Возможно, он будет использоваться на новом веб-сайте, в веб-службе, службе Windows и т. Д. Во всех этих случаях окно сообщения будет неуместным.

Правильный способ справиться с этим - предоставить событие, на которое может подписаться ваш пользовательский интерфейс или любой другой потребитель вашего бизнес-класса. Пусть уровень пользовательского интерфейса решит, будет ли он отображать окно сообщения или нет.

Вам, безусловно, следует также взглянуть на некоторые из каркасов ведения журналов и, возможно, зарегистрировать это событие.

3 голосов
/ 06 августа 2009

В бизнес-классе вы НИКОГДА не должны использовать прямую связь с пользователем.

Это потому, что пользовательский интерфейс может быть winforms / webforms / console / smart_devices / etc ... или пользовательский интерфейс не используется (например, в скриптах).

Если вам нужно определиться с пользователем в бизнес-процессе, вы можете использовать несколько способов, как это сделать. В .NET это один из простых способов событий.

Например:

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;}
}

Затем пользовательский интерфейс может перехватывать события и отображать правильный пользовательский интерфейс (окно сообщения, поле ввода, веб-форма, чтение / запись консоли и т. Д. ...

3 голосов
/ 06 августа 2009

Окна сообщений, вероятно, везде неверны. Я уже могу сказать вам результат, прежде чем вы их показали. Пользователи будут нажимать Отмена. Они всегда делают. Если вы нажмете на одно и то же сообщение не много позже, ваши пользователи будут нажимать «Продолжить», потому что «Отмена» не сделала то, что они хотели.

Итак, если вы уже знаете ответ, зачем задавать вопрос?

...