2009-08-06 2 views
2

비즈니스 클래스의 System.Windows.Forms에 대한 참조가 있고 MessageBox.Show를 잘못 사용하고 있습니까?비즈니스 클래스의 메시지 박스가 잘못 되었습니까?

현재 서비스 클래스를 꾸미는 이벤트 처리 데코레이터 클래스가 있습니다. 특정 이벤트가 발생하면 데코레이터는 사용자에게 특정 기능을 처리 할 것인지 묻는 메시지를 표시하려고합니다.

이 장식 클래스에 이러한 메시지 상자가 있어도 괜찮습니까?

답변

11

비즈니스 클래스에는 UI가 없어야합니다.

이유는 비즈니스 계급이 어떻게 쓰이는 지 결코 알 수 없기 때문입니다. 아마도 새로운 웹 사이트, 웹 서비스, Windows 서비스 등에 사용될 것입니다.이 모든 경우에 메시지 상자는 부적절 할 수 있습니다.

올바른 방법은 UI 또는 비즈니스 클래스의 다른 소비자가 구독 할 수있는 이벤트를 제공하는 것입니다. UI 레이어가 메시지 상자를 표시할지 여부를 결정하도록합니다.

로깅 프레임 워크를 살펴보고 아마도이 이벤트를 기록해야합니다.

+0

은 어떻게 얻을 것 읽기 UI로 이벤트를 실행하면 응답이 다시 나타남? 메시지 상자에서 예 또는 아니요를 선택했는지 어떻게 알 수 있습니까? – c00ke

+0

이벤트는 EventArgs 매개 변수를 통해 응답을 제공합니다. 사실 플래그를 설정하고 반환하는 이벤트를 처리하면 사용자에게 묻는 대신 결정을 내리게됩니다. –

+1

기본 아이디어 : 1. 귀하의 비즈니스에 사용자 정의 이벤트를 정의하십시오. 예 : serviceNotificationEvent 또는 유사합니다. 당신이 메시지 박스를 고려하고있는 장소에서 2. 대신 같은 것을 할 : (! serviceNotificationEvent = NULL) 경우를 { serviceNotificationEvent (새 ServiceNotificationEventArgs (someData, moreData)); } 당신의 UI에서 3, ServiceNotificationEvent에 가입 예컨대 : myServiceObject.ServiceNotificationEvent + = 새 ServiceNotificationEventHandler(); 위의 코드는 의사 코드입니다.자세한 내용은 여기에서 이벤트를 읽어보십시오. http://www.akadia.com/services/dotnet_delegates_and_events.html –

3

메시지 상자가 모든 곳에서 잘못된 것 같습니다. 이미 그 결과를 보여주기 전에 결과를 말할 수 있습니다. 사용자가 취소를 클릭합니다. 그들은 항상 그렇습니다. 사용자가 동일한 메시지 함을 나중에 많이 누르지 않으면 "취소"가 원하는 것을 수행하지 않아 사용자가 계속을 클릭하게됩니다.

이미 답변을 알고 있다면 질문하는 것이 왜 어려운가요?

+0

+1 통찰력있는 :) –

3

bussines 클래스에서는 직접적인 UI 통신을 사용하지 않아야합니다.

UI가 winforms/webforms/console/smart_devices/etc ...이거나 UI가 사용되지 않기 때문입니다 (예 : 스크립트).

사용자가 bussines 프로세스에서 결정해야하는 경우 몇 가지 방법을 사용할 수 있습니다. .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;} 
} 

UI를 다음 이벤트를 연결하고 올바른 UI를 표시 할 수는 (메시지 박스가에서 InputBox, 웹 양식, 콘솔/쓰기 등 ....

관련 문제